python - @pyglet.window.Window.event 如何工作?

标签 python python-3.x decorator python-decorators pyglet

我正在学习 pyglet,我很困惑 @window.event 做了什么。我查阅了Python文档,它说它通过装饰器函数传递了下面的函数,但我不知道这对Pyglet有什么作用。我在 pyglet 文档中找不到任何内容。而且我也很困惑 on_draw() 如何以及何时被调用,如果这与第一个问题有关。预先感谢您。

pyglet.window.Window.event 的代码在这里:pyglet source

最佳答案

每个 GUI(或游戏)都运行称为“mainloop”或“evenloop”的特殊循环来完成所有工作。 Pyglet 使用 run() 启动此循环。

Pyglet 有一个特殊的队列来存储称为“事件”的信息

当您按下按钮时,系统会将按下的键的信息“event_keydown”添加到队列中;当您单击鼠标时,系统会将按下的按钮和鼠标位置添加到队列信息“event_mousebuttondown”;等等

Pyglet 中的其他函数也可以将信息添加到队列中,以便 mainloop 可以稍后从队列中获取此信息。 IE。当您单击按钮时,按钮可以添加到队列“even_draw”,因为它需要用新颜色重新绘制,主循环将在稍后执行此操作。

@window.event 将函数名称添加到分配给事件名称的特殊列表/字典中。

special_dict["event_draw"] = on_draw

“mainloop”检查所有带有事件的时间队列。当它得到“event_draw”时,它会检查“special_dict”以获取它必须执行的函数名称 - 它得到“on_draw”并执行“on_draw()”

当您单击鼠标时,系统会将“event_mousebuttondown”放入队列中。当主循环从队列中获取此“event_mousebuttondown”时,会将其发送到所有小部件,并且每个小部件都会检查它是否被单击。如果单击某个小部件并且必须更改颜色/形状/等。然后它可以将“event_draw”放入队列中。稍后“mainloop|”可以从队列中获取“event_draw”并执行“on_draw”来重绘窗口。

因为“mainloop”一直检查队列并且速度很快(并且分配给事件的所有函数都很短),所以看起来一切都是同时完成的,并且所有小部件同时工作 - 就像它们使用的那样线程(但他们不使用线程)。当您将 sleep()while True 放入任何函数中时,它会停止“主循环”并且一切都会卡住。

关于python - @pyglet.window.Window.event 如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41538687/

相关文章:

python - 为什么对全局变量的错误分配会提早引发异常?

python - 在一个函数中调用2个函数

python - Else子句在Python异常处理中的应用

python - NLP AI 逻辑 - 每个序列架构具有多个参数的对话序列

python - 'Can\'t connect to MySQL server on\' db\' Django-Restframework with Mysql in docker

Python:制作一个返回同一个类的方法的类方法装饰器

python - 我可以在包装函数之前修补 Python 装饰器吗?

java - 是否可以从 Python 生成 Java 代码,并在两个进程之间进行通信?

python-3.x - redis - 如何创建事务

Angular 4装饰器无法访问类范围