首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >海龟图形Python,.mainloop()

海龟图形Python,.mainloop()
EN

Stack Overflow用户
提问于 2016-09-11 02:22:57
回答 2查看 2.8K关注 0票数 1

我正在用Python编程,我有几个问题在任何地方都找不到答案(请阅读所有问题,因为它们构成了我的最后一个问题):

1. .mainloop()到底做了什么?我阅读了Stack Overflow中的所有答案,我还检查了文档解释。

2. .mainloop()一定要放在海龟程序的末尾吗?

3.我以前用过.mainloop()。我的问题是,如果我有f.f.g代码:

代码语言:javascript
复制
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的事件是如何进入事件循环的呢?

EN

回答 2

Stack Overflow用户

发布于 2016-12-18 12:34:35

1. .mainloop()真正的作用是什么?

Turtle的mainloop()调用tkinter的mainloop(),后者调用Tk的Tk_MainLoop(),这非常简单:

代码语言:javascript
复制
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。如果我们给它们不同的颜色和不同的事件处理程序,我们可以清楚地看到这一点:

代码语言:javascript
复制
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堆栈将显示以下内容:

代码语言:javascript
复制
> python3 test.py
Tess clicked
Alex clicked
Alex clicked
Alex clicked
Alex clicked
Alex clicked
Alex clicked

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

票数 3
EN

Stack Overflow用户

发布于 2016-09-11 02:43:12

所以mainloop()是一个无限循环,它基本上会在某个点阻塞代码的执行。你调用它一次(而且只有一次)。

因此,让我们说:

代码语言:javascript
复制
while true:
circle.draw()
sumden.mainloop()
print "circle is being drawn"
time.sleep(0.1)

您永远看不到output和print语句,因为没有循环。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39429227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档