1.mainloop()究竟做了什么?
乌龟的mainloop()
电话的Tkinter的mainloop()
它调用Tk的的Tk_MainLoop()
这是出奇的简单:
void
Tk_MainLoop(void)
{
while (Tk_GetNumMainWindows() > 0) {
Tcl_DoOneEvent(0);
}
}
它,而有任何主窗口打开处理事件,一次一个,无限循环。处理的事件包括键盘输入,按钮点击,窗口重塑,文件I/O,网络活动,定时器,显示刷新和任何其他注册回调。
一种性能优良,主循环的一个页面描述可以在引进发现第15章主循环的解剖在O'Reily书掌握的Perl/Tk的由史蒂夫Lidie和南希·沃尔什。虽然它是一本Perl/Tk书,但关于mainloop的信息也适用于Python。你可以在网上找到这些材料,但我不会在这里包含链接,因为我不知道哪些在线副本是合法发布的。但是你有足够的信息来搜索它。
2. .mainloop()总是必须在一个龟的程序结束?
不是。它应该是精心设计的程序的一部分,但不是必需的。大多数独立程序将包括它(或称之为.done()
或.exitonclick()
),因为图形窗口将在没有它的情况下关闭。但有些情况下,例如。 IDLE也许不需要它来保持图形可见。我在初学者的乌龟程序中发现的一个常见错误是,在调用mainloop()
之前创建一个无限循环的龟活动,然后想知道为什么各种事件不会触发。
如果您打算让Tk为您处理键盘,鼠标和计时器事件,那么致电.mainloop()
是您开始的方式。在大多数Python/Tk程序中,这是最后一条语句,但是当所有Tk窗口全部关闭时,可以在其后执行其他代码。
我们可以将龟编程视为编写Tk主循环的插件代码。设置好之后,后续活动将通过我们通过on*()
函数注册的回调函数完成。
3.我以前使用过mainloop()。我的问题是,如果我有FFG代码:...当函数 是()运行
当程序运行时为什么亚历克斯得到一个动作事件,海龟Alex和苔丝堆积顶部彼此在窗户的中央。当你点击这个乌龟堆栈时,事件将发送给Tess,他们都在顶层并且有一个事件处理程序。在她的事件处理程序中,Tess在Alex上安装了一个事件处理程序。在亚历克斯上安装事件处理程序的行为导致Alex在Tess面前移动,并升至栈顶。从现在起,当你点击海龟堆栈时,Alex处理事件,他们不再触及苔丝。我们可以清楚地看到这一点,如果我们给他们不同的颜色和不同的事件处理程序:
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和苔丝到不同的位置和然后点击它们以确认Alex在第一次单击Tess时才开始接收事件。
也许代码以这种方式运行,但我不认为这是它被解释的方式。 – Volcano
我知道代码打印语句不会运行,直到您关闭乌龟窗口,但这不是我正在寻找的信息。 – Volcano
哦,抱歉,这没有帮助。也许我没有很好地阅读你的问题。你能解释一下你在找什么吗? – Neeks