首页 > 后端开发 > Python教程 > 为什么`pygame.event.get()`无法在单独的线程中返回事件?

为什么`pygame.event.get()`无法在单独的线程中返回事件?

Patricia Arquette
发布: 2024-12-01 11:54:13
原创
709 人浏览过

Why Does `pygame.event.get()` Fail to Return Events in a Separate Thread?

pygame.event.get() 未能在单独的线程中返回事件

此查询与使用 pygame.event 时遇到的困难有关.get() 在一个单独的线程中,用于管理吃豆人启发的游戏中的用户输入。负责接收输入的代码片段如下:

def receiving_inputs(self):
    while True:
        events = pg.event.get()
        for event in events:
            if event.type == pg.KEYDOWN:
                if event.key == pg.K_UP:
                    self.move = 'n'
                elif event.key == pg.K_RIGHT:
                    self.move = 'e'
                elif event.key == pg.K_DOWN:
                    self.move = 's'
                elif event.key == pg.K_LEFT:
                    self.move = 'w'
        time.sleep(1/60)

threading.Thread(target=self.receiving_inputs).start()
登录后复制

执行此代码时,按下键盘按键不会触发任何事件,而移动鼠标会返回事件。有趣的是,当在程序的主循环而不是单独的线程中执行时,相同的代码可以完美地运行。

这个问题源于希望通过使用单独的线程来最大限度地减少主循环中未注册的按键实例.

解决方案:

意外行为源于以下事实事件必须在主线程内管理。如 pygame.event 文档中所述:

[...] 事件子系统应该从主线程调用。

虽然从单独的线程发布事件是可行的,但事件队列只能由主线程处理。因此,

  1. 确保在主线程中获取事件:

    def receiving_inputs(self):
        while True:
            events = pg.event.get()
            for event in events:
                ...
    登录后复制
  2. 创建一个线程,根据事件修改游戏状态事件:

    def move(self, move):
        ...
    
    thread = threading.Thread(target=self.move, args=(move,))
    thread.start()
    登录后复制

以上是为什么`pygame.event.get()`无法在单独的线程中返回事件?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板