2016-09-10 388 views
1

我在Python编程,我有,我不能找到答案随时随地几个问题(请阅读所有的问题,因为他们建立了我的最后一个问题):乌龟图形的Python,.mainloop()

1. .mainloop()真的干什么?我阅读了堆栈溢出中的所有答案,我也检查了文档解释。

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() 

为什么亚历克斯得到一个动作事件时功能yes()运行?我知道这是因为函数被调用,但实际发生了什么?我的意思是turtle.mainloop()是在tess被点击前运行的,并且在事件循环中等待tess的动作事件,所以在运行turtle.mainloop()后,alex的事件如何进入事件循环?

回答

0

所以mainloop()是一个无限循环,基本上阻止了你的代码在某个点执行。你只需要调用一次(并且只能调用一次)。

所以可以说:

while true: 
circle.draw() 
sumden.mainloop() 
print "circle is being drawn" 
time.sleep(0.1) 

你永远不会看到输出和打印语句,因为没有循环。

+0

也许代码以这种方式运行,但我不认为这是它被解释的方式。 – Volcano

+0

我知道代码打印语句不会运行,直到您关闭乌龟窗口,但这不是我正在寻找的信息。 – Volcano

+0

哦,抱歉,这没有帮助。也许我没有很好地阅读你的问题。你能解释一下你在找什么吗? – Neeks

2

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时才开始接收事件。