pyGame在一个帖子中

Dan*_*Dan 5 python macos multithreading pygame

我想使用pyGame程序作为另一个进程的一部分.使用以下代码,pyGame似乎不处理事件; 它不会响应'q'键,也不会为窗口绘制标题栏.如果go()不是作为一个线程运行,它可以正常工作.这是在OSX下; 我不确定这是不是问题.

import pygame, threading, random

def go():
  pygame.init()
  surf = pygame.display.set_mode((640,480))
  pygame.fastevent.init()

  while True:
    e = pygame.fastevent.poll()
    if e.type == pygame.KEYDOWN and e.unicode == 'q':
      return

    surf.set_at((random.randint(0,640), random.randint(0,480)), (255,255,255))
    pygame.display.flip()

t = threading.Thread(target=go)
t.start()
t.join()
Run Code Online (Sandbox Code Playgroud)

Kyl*_*tan 5

最好在主线程中进行事件处理和图形处理.有些环境真的不喜欢你试图从其他线程渲染,有些环境不喜欢你试图从它们中排出事件队列.

甚至可能无法做你希望做的事情,因为你正在运行的过程可能有自己的想法,关于谁拥有消息队列和你正在渲染的窗口.


小智 5

Pygame不是线程安全的,并且eventloop需要在主线程上运行!否则,您可能会遇到问题.

一种解决方案是pygame.mainloop()从主线程调用.

但是,您可能正在使用其他需要从主线程运行的模块.在这种情况下,存在一种pythonic解决方案.你有可能用参数运行pygame mainloop.这个参数意味着:运行mainloop只有几秒钟.因此,你可以做的是创建一个运行mainloop 0.1秒的生成器,你可以定期从主线程调用它.例如:

def continue_pygame_loop():
    pygame.mainloop(0.1)
    yield
Run Code Online (Sandbox Code Playgroud)

然后只是continue_pygame_loop()定期从主线程调用

Tkinter遇到同样的问题,但没有办法指定runloop()超时.对我来说,这就是为什么pygame很棒!

  • 据我所知,`pygame` 没有 `mainloop()` 函数。(我使用的是 v1.9.2),所以不清楚你在说什么。当您将它与`tkinter`(哪个)混淆时? (2认同)

Wee*_*ble 5

可能是一个长镜头,但请确保在进入线程之前不要导入 Pygame。问题很可能是您在一个线程上导入 Pygame,然后在另一个线程上使用它。但是,在多个线程上导入可能会有其他问题。特别是,确保一旦您启动 Pygame 线程,您就等待它完成导入,然后再执行任何可能导致 Python 进程关闭的操作,否则您可能会遇到死锁。