python - 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。允许在事件循环之外调度和传播事件的魔法是什么?
解决方案
在选项 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()
推荐阅读
- javascript - 可以在 Discord.js 中嵌入按钮吗?
- java - 我们如何共享相同的火花上下文
- javascript - Opencart 日志主题 - js.cookie.js?v=3.0.7 404(未找到)
- python-3.x - 多列以日期时间作为索引而不丢失其他列
- css - 如何使用 img 标签而不是 inline-css 定位横幅背景图像(图像的位置中心)
- python - 试图在我的列表 python 的每个值之间添加一个逗号
- sql-server - SQL 根据多个条件过滤行并获取匹配的记录
- javascript - 在推入javascript之前更改for循环中的数组索引
- php - 页面上多个时显示错误的错误消息
- visual-studio - Visual Studio 窄条