@pyglet.window.Window.event 是如何工作的?

How does @pyglet.window.Window.event work?

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

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

每个 GUI(或游戏)都运行称为 "mainloop" 或 "even loop" 的特殊循环来完成所有工作。 Pyglet 以 run() 开始这个循环。

Pyglet 有一个名为 "events"

的特殊信息队列

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

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

@window.event 将函数名称添加到分配给事件名称的特殊 list/dictionary 即。

special_dict["event_draw"] = on_draw

"mainloop" 检查所有有事件的时间队列。当它得到 "event_draw" 然后它检查 "special_dict" 得到它必须执行的函数名 - 它得到 "on_draw" 并执行 "on_draw()"

当您点击鼠标时,系统会放入队列"event_mousebuttondown"。当 mainloop 从队列中获取这个 "event_mousebuttondown" 时,它会将它发送到所有小部件,并且每个小部件检查它是否被单击。如果单击了某个小部件并且必须更改 color/shape/etc。然后它可以将 "event_draw" 放入队列中。稍后“mainloop|可以从队列中获取"event_draw"并执行"on_draw"重绘window.

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