^{bq}$

海龟的mainloop()称为tkinter的mainloop(),而Tk的{}非常简单:void

Tk_MainLoop(void)

{

while (Tk_GetNumMainWindows() > 0) {

Tcl_DoOneEvent(0);

}

}

当主窗口打开时,它以无限循环的方式处理事件,一次处理一个事件。处理的事件包括键盘输入、按钮单击、窗口重塑、文件I/O、网络活动、计时器、显示刷新和任何其他已注册的回调。在

关于mainloop的一页很好的描述可以在第15章的导言中找到。在史蒂夫·利迪和南希·沃尔什的《掌握Perl/Tk》一书中对主循环的剖析。尽管这是一本Perl/Tk书,但是关于mainloop的信息对于Python也是有效的。你可以在网上找到这些材料,但我不会在这里包括一个链接,因为我不知道哪些,如果有的话,在线副本是合法发布的。但你有足够的信息来搜索它。在2.Does the .mainloop() always have to be at the end of a turtle program?

不,它应该是一个设计良好的程序的一部分,但不是必需的。大多数独立程序都会包含它(或者类似于.done()或.exitonclick())的图形窗口将在没有它的情况下关闭。但有些情况下,例如空闲,不需要它来保持图形可见。我在初学者的turtle程序中发现的一个常见错误是在调用mainloop()之前创建一个海龟活动的无限循环,然后想知道为什么各种事件都不触发。在

如果您计划让Tk处理键盘、鼠标和计时器事件,那么调用.mainloop()就是开始的方法。在大多数Python/Tk程序中,这是最后一个语句,但是在它之后还有其他代码在所有Tk窗口都关闭时执行。在

我们可以把turtle编程看作是为Tk的主循环编写插件代码。设置好之后,接下来的活动将由我们通过on*()函数注册的回调函数来完成。在3.I have used mainloop() before. My question is, if I have the f.f.g code: ... Why does alex get an action event when the function

yes() is run

当你的程序运行时,海龟亚历克斯和苔丝堆在窗口的中央。当您单击这个turtle堆栈时,事件将转到Tess,她位于顶层,并有一个事件处理程序。在她的事件处理程序中,Tess在Alex上安装了一个事件处理程序。在Alex上安装事件处理程序的行为会导致Alex移动到Tess的前面,上升到堆栈的顶部。从现在起,当你点击turtle堆栈时,Alex会处理事件,而这些事件将不再联系到Tess。如果我们给它们不同的颜色和不同的事件处理程序,我们可以清楚地看到这一点:

^{pr2}$

单击turtle堆栈将生成:> python3 test.py

Tess clicked

Alex clicked

Alex clicked

Alex clicked

Alex clicked

Alex clicked

Alex clicked

您可以将Alex和Tess移动到窗口中的不同位置,然后单击它们以确认Alex在第一次单击Tess之前不会开始接收事件。在

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐