首页 > 解决方案 > Turtle Tk 主循环

问题描述

在尝试将turtle移植到不同的后端(不是Tkinter)时,我遇到了以下问题

from turtle import *
onscreenclick(lambda x,y:print(x,y))
while True:
    #a=heading()  # option 1. clicks are not reported
    setheading(0) # option 2: clicks are reported

注意 mainloop() 没有被调用。虽然我知道在海龟编程中使用 while True 循环是一个坏习惯,但我不明白为什么这个程序可以使用选项 2。允许在事件循环之外调度和传播事件的魔法是什么?

标签: pythontkinterpython-turtle

解决方案


在选项 1 中,您在询问海龟,在选项 2 中,您在要求海龟做某事。我的猜测是,在第一种情况下,没有切换到事件处理程序来检查点击。在第二种情况下,作为做某事的一部分,对事件处理程序进行了切换。

这在标准海龟(使用 Tkinter)上的行为方式相同,其中第一个选项从不打印。让我们通过添加.update()

from turtle import *

onscreenclick(print)

while True:
    a = heading()  # option 1. clicks are reported
    # setheading(0)  # option 2: clicks are reported

    update()

这适用于标准海龟下的两种情况,因为现在我们在每次迭代时都将其交给事件处理程序。这是一个例子,说明为什么while True不仅是一个坏习惯,而且是一个坏主意。在标准海龟中,我会使用计时器事件来编写:

from turtle import *

onscreenclick(print)

def run():
    a = heading()  # option 1. clicks are reported
    # setheading(0)  # option 2: clicks are reported

    ontimer(run)

run()

mainloop()

推荐阅读