我想使用 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()
最佳答案
Pygame 不是线程安全的,事件循环需要在主线程上运行!否则,可能会出现您描述的问题。
一种解决方案是拨打 pygame.mainloop()
从主线程。
但是,也许您正在使用其他也需要从主线程运行的模块。在这种情况下有一个 pythonic 解决方案。您可以使用参数运行 pygame mainloop。这个参数的意思是:只运行主循环几秒钟。因此,您可以做的是创建一个运行主循环 0.1 秒的生成器,您可以定期从主线程调用该生成器。例如:
def continue_pygame_loop():
pygame.mainloop(0.1)
yield
然后只需拨打
continue_pygame_loop()
定期从主线程Tkinter 遇到同样的问题,但无法指定
runloop()
超时。对我来说,这就是为什么 pygame 很棒!
关于python - 线程中的 pyGame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63913788/