我正在学习 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/