#python #tkinter #python-turtle
#python #tkinter #python-turtle
Вопрос:
При попытке перенести 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 в программировании turtle, я не понимаю, почему эта программа работает с вариантом 2. Что это за магия, которая позволяет отправлять и распространять события вне цикла событий?
Ответ №1:
В варианте 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()
Комментарии:
1. Означает ли это, что существует параллельный обработчик событий, который выполняется вне mainloop? Я не могу найти его в turtle.py (но мои знания в области тз очень ограничены).