python - 线程中的 pyGame

标签 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()

最佳答案

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/

相关文章:

python - 如何只获取MySQL表中的字段?

python - 在 python 3.5 Mac OS High sierra 上安装 numpy

ios - .sqlite 和 .storedata 有什么区别

c# - OutOfMemory Exception C# 使用线程时

python - 如何遍历整个html表并转换为json数据?

python - 从 sklearn 导入指标时出现导入错误

python - Scapy sniff() 在一个子类 threading.Thread() 的类中

iphone - 开源Mac视频流服务器解决方案?

c# - 查询任务的 Result 属性导致线程池创建一个新线程

java - 单例类的公共(public)方法应该同步吗?