我正在用Python编程,我有几个问题在任何地方都找不到答案(请阅读所有问题,因为它们构成了我的最后一个问题):
1. .mainloop()到底做了什么?我阅读了Stack Overflow中的所有答案,我还检查了文档解释。
2. .mainloop()一定要放在海龟程序的末尾吗?
3.我以前用过.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()为什么alex在运行函数yes()时会得到一个动作事件?我知道是这样的,因为函数被调用了,但实际发生了什么呢?我的意思是,在单击tess之前运行语句turtle.mainloop(),并且在事件循环中等待tess的操作事件,那么既然它的语句是在运行turtle.mainloop()之后运行的,那么alex的事件是如何进入事件循环的呢?
发布于 2016-12-18 12:34:35
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所著的O‘’Reily一书Mastering Perl/Tk中的介绍第15章.剖析 MainLoop中,可以找到关于主循环的一页优秀描述。虽然这是一本Perl/Tk的书,但是关于mainloop的信息对于Python也是有效的。你可以在网上找到这份材料,但我不会在这里包含链接,因为我不知道哪些在线副本是合法发布的。但是你有足够的信息来搜索它。
2. .mainloop()一定要放在海龟程序的末尾吗?
不是的。它应该是一个设计良好的程序的一部分,但不是必需的。但在某些情况下,例如。空闲也许,不需要它来保持图形的可见性。我在初学者的turtle程序中发现的一个常见错误是,在调用mainloop()之前创建了turtle活动的无限循环,然后想知道为什么不会触发各种事件。
如果你计划让Tk为你处理键盘、鼠标和计时器事件,那么调用.mainloop()就是你开始的方式。在大多数Python/Tk程序中,它是最后一条语句,但当所有Tk窗口都关闭时,它后面可能会有其他代码被执行。
我们可以把turtle编程看作是为Tk的主循环编写插件代码。
mainloop 3.我以前用过
()。我的问题是,如果我有f.f.g代码:...为什么alex在函数yes()运行时会得到一个action事件
当您的程序运行时,乌龟Alex和Tess会堆叠在窗口的中央。当您单击这个海龟堆栈时,事件将转到Tess,她既在顶部,又有一个事件处理程序。在她的事件处理程序中,Tess在Alex上安装了事件处理程序。在Alex上安装事件处理程序的行为导致Alex移动到Tess的前面,上升到堆栈的顶部。从现在开始,当你点击乌龟堆栈时,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()单击turtle堆栈将显示以下内容:
> python3 test.py
Tess clicked
Alex clicked
Alex clicked
Alex clicked
Alex clicked
Alex clicked
Alex clicked您可以将Alex和Tess移动到窗口中的不同位置,然后单击它们以确认Alex在第一次单击Tess之前不会开始接收事件。
发布于 2016-09-11 02:43:12
所以mainloop()是一个无限循环,它基本上会在某个点阻塞代码的执行。你调用它一次(而且只有一次)。
因此,让我们说:
while true:
circle.draw()
sumden.mainloop()
print "circle is being drawn"
time.sleep(0.1)您永远看不到output和print语句,因为没有循环。
https://stackoverflow.com/questions/39429227
复制相似问题