Turtle Graphics Python、.mainloop() [英] Turtle Graphics Python, .mainloop()
问题描述
我正在用Python编程,我有几个问题在任何地方都找不到答案(请阅读所有问题,因为它们构成了我的最后一个问题):
1..mainloop()
到底做了什么?我阅读了堆栈溢出中的所有答案,还检查了文档说明。
2..mainloop()
必须始终位于Turtle程序的末尾吗?
.mainloop()
。我的问题是,如果我有f.f.g代码:
import turtle
screen = turtle.Screen()
alex = turtle.Turtle()
tess = turtle.Turtle()
def yes(x, y):
alex.onclick(yes)
print("Hello World")
tess.onclick(yes)
turtle.mainloop()
<2-3]>函数yes()
运行时,Alex为什么会收到操作事件?我知道是这样的,因为函数被调用了,但实际发生了什么?我的意思是turtle.mainloop()
语句在单击TESS之前运行,而TESS的操作事件在事件循环中等待,那么Alex的事件是如何进入事件循环的,因为它的语句是在turtle.mainloop()
运行之后运行的?
推荐答案
1.mainloop()到底做什么?
Turtle的mainloop()
调用tkinter的mainloop()
,后者调用Tk的Tk_MainLoop()
,这非常简单:
void
Tk_MainLoop(void)
{
while (Tk_GetNumMainWindows() > 0) {
Tcl_DoOneEvent(0);
}
}
当有任何主窗口打开时,它在无限循环中一次处理一个事件。处理的事件包括键盘输入、按钮点击、窗口重塑、文件I/O、网络活动、计时器、显示刷新和任何其他注册的回调。
Steve Lidie和Nancy Walsh所著的一书中一书中一章介绍虽然这是一本Perl/Tk版的书,但是关于mainloop的信息对于Python也是有效的。你可以在网上找到这份材料,但我不会在这里添加链接,因为我不知道哪些在线副本是合法发布的。但您有足够的信息来搜索它。
2..mainloop()是否必须始终位于Turtle程序的末尾?
不。它应该是设计良好的程序的一部分,但不是必需的。大多数独立程序都会包含它(或者像.done()
或.exitonclick()
这样的名称),因为没有它的图形窗口将在完成时关闭。但在某些情况下,例如。空闲也许,不需要它来保持图形的可见性。我在初学者的Turtle程序中发现的一个常见错误是,在调用mainloop()
之前创建了Turtle活动的无限循环,然后想知道为什么各种事件不会触发。
.mainloop()
就是开始。在大多数Python/Tk程序中,它是最后一条语句,但在它之后可以有其他代码,在所有Tk窗口都关闭后执行。
我们可以将Turtle编程看作是为Tk的主循环编写插件代码。设置完成后,后续活动将通过回调我们通过on*()
函数注册的函数来完成。
3.我以前使用过mainloop()。我的问题是,如果我有f.f.g代码:...为什么Alex会在函数 是()正在运行
当您的程序运行时,乌龟Alex和Tess堆积在窗口的中央。当您点击这个海龟堆栈时,事件转到Tess,她同时在顶部,并且有一个事件处理程序。在她的事件处理程序中,Tess在Alex上安装了一个事件处理程序。在Alex上安装事件处理程序的行为导致Alex移动到Tess的前面,上升到堆栈的顶部。从现在开始,当你点击乌龟堆叠,亚历克斯处理事件,他们不再到达苔丝。如果我们给它们不同的颜色和不同的事件处理程序,我们可以清楚地看到这一点:
import turtle
alex = turtle.Turtle(shape="turtle")
alex.color("blue")
tess = turtle.Turtle(shape="turtle")
tess.color("pink")
def tess_handler(x, y):
alex.onclick(alex_handler)
print("Tess clicked")
def alex_handler(x, y):
print("Alex clicked")
tess.onclick(tess_handler)
turtle.mainloop()
单击海龟堆栈将显示:
> python3 test.py
Tess clicked
Alex clicked
Alex clicked
Alex clicked
Alex clicked
Alex clicked
Alex clicked
您可以将Alex和Tess移动到窗口中的不同位置,然后单击它们以确认Alex在第一次单击Tess之前不会开始接收事件。
这篇关于Turtle Graphics Python、.mainloop()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!