Turtle Tk mainloop

#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 (но мои знания в области тз очень ограничены).