python - turtle 图形 Python,.mainloop()

标签 python user-interface events turtle-graphics event-loop

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

1..mainloop() 的作用是什么?我阅读了 Stack Overflow 中的所有答案,还检查了文档说明。

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

为什么 alex 在函数 yes() 运行时会收到 Action 事件?我知道它确实如此,因为该函数被调用了,但实际上发生了什么?我的意思是语句 turtle.mainloop() 在 tess 被点击之前运行,并且 tess 的 Action 事件在事件循环中等待,那么 alex 的事件在其语句运行后如何进入事件循环turtle.mainloop() 运行后?

最佳答案

1.What Does the .mainloop() really do?

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

void
Tk_MainLoop(void)
{
    while (Tk_GetNumMainWindows() > 0) {
        Tcl_DoOneEvent(0);
    }
}

当有任何主窗口打开时,它会在无限循环中一次处理一个事件。处理的事件包括键盘输入、按钮单击、窗口形状调整、文件 I/O、网络事件、计时器、显示刷新和任何其他已注册的回调。

在 O'Reily 书中第 15 章主循环剖析的简介中可以找到对主循环的精彩一页描述掌握 Perl/Tk,作者:Steve Lidie 和 Nancy Walsh。尽管这是一本 Perl/Tk 书籍,但有关 mainloop 的信息也适用于 Python。您可以在线找到此 Material ,但我不会在此处添加链接,因为我不知道哪些在线副本(如果有)是合法发布的。但您有足够的信息来搜索它。

2.Does the .mainloop() always have to be at the end of a turtle program?

没有。它应该是精心设计的程序的一部分,但不是必需的。大多数独立程序都会包含它(或者调用它的东西,如 .done().exitonclick()),因为如果没有它,图形窗口将在完成时关闭。但有些情况,例如。也许空闲,不需要它来保持图形可见。我在初学者的 turtle 程序中发现的一个常见错误是在调用 mainloop() 之前创建 turtle 事件的无限循环,然后想知道为什么各种事件不触发。

如果您计划让 Tk 为您处理键盘、鼠标和计时器事件,那么调用 .mainloop() 就是您开始的方式。在大多数 Python/Tk 程序中,它是最后一条语句,但它后面可能还有其他代码,当所有 Tk 窗口全部关闭时,这些代码就会被执行。

我们可以将 turtle 编程视为为 Tk 的主循环编写插件代码。设置完成后,后续事件将通过我们通过 on*() 函数注册的回调函数来完成。

3.I have used mainloop() before. My question is, if I have the f.f.g code: ... Why does alex get an action event when the function yes() is run

当你的程序运行时, turtle Alex 和 Tess 在窗口中央相互堆叠。当您单击此 turtle 堆栈时,事件将发送给 Tess,她位于顶部并且有一个事件处理程序。在她的事件处理程序中,Tess 在 Alex 上安装了一个事件处理程序。在 Alex 上安装事件处理程序的行为会导致 Alex 移动到 Tess 前面,上升到堆栈的顶部。从现在开始,当您单击 turtle 堆栈时,亚历克斯将处理事件,并且它们不再到达苔丝。如果我们给它们不同的颜色和不同的事件处理程序,我们可以清楚地看到这一点:

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 之前不会开始接收事件。

关于python - turtle 图形 Python,.mainloop(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39429227/

相关文章:

python - 从 IPython 运行 Flask 引发 SystemExit

c# - UI 元素上的 Unity "pacman effect"

c# - 实现 MS Access 样式 'relationships' GUI

c# - 如何在 C# 中创建属性更改和更改事件的事件

javascript - "change"元素的 "input"和 `input` 事件之间的区别

Javascript 对象 - 强制触发事件

python - Pandas 数据框操作

python - 是否可以在 Python 中覆盖赋值 ('=' ) 运算符?

python - Tensorflow 中的 tf.expand_dims 和 tf.newaxis 有什么区别?

Qt 上的 C++ : Controlling transparency of Labels and Buttons