Turtle Graphics Python、.mainloop() [英] Turtle Graphics Python, .mainloop()

查看:0
本文介绍了Turtle Graphics Python、.mainloop()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

1..mainloop()到底做了什么?我阅读了堆栈溢出中的所有答案,还检查了文档说明。

2..mainloop()必须始终位于Turtle程序的末尾吗?

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()
<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活动的无限循环,然后想知道为什么各种事件不会触发。

如果您计划让Tk为您处理键盘、鼠标和计时器事件,那么调用.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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆