1.Что делает .mainloop() действительно?
черепаха mainloop()
звонков Tkinter-х mainloop()
, который вызывает Tk-х Tk_MainLoop()
, который удивительно прост:
void
Tk_MainLoop(void)
{
while (Tk_GetNumMainWindows() > 0) {
Tcl_DoOneEvent(0);
}
}
Он обрабатывает события, по одному за раз, в бесконечном цикле, пока есть какие-либо основные открытые окна. Обработанные события включают ввод с клавиатуры, нажатия кнопок, изменения окон, ввод-вывод файлов, активность в сети, таймеры, обновления дисплея и любые другие зарегистрированные обратные вызовы.
Прекрасным, одна страница описания из основного цикла можно найти в предисловии к Глава 15. Анатомия MainLoop в книге O'Reily Mastering Perl/Tk Стивом Lidie и Нэнси Уолш , Хотя это книга Perl/Tk, информация о mainloop действительна и для Python. Вы можете найти этот материал в режиме онлайн, но я не буду включать ссылку здесь, поскольку я не знаю, какие, если таковые имеются, онлайн-копии, законно отправлены. Но у вас достаточно информации для его поиска.
2.Наконец .mainloop() всегда должен быть в конце программы черепахи?
№ Это должно быть частью хорошо спроектированной программы, но не требуется. Большинство автономных программ будут включать в себя (или что-то, что называет его .done()
или .exitonclick()
), когда графическое окно закрывается без его завершения. Но некоторые ситуации, например. Возможно, IDLE не нуждается в этом, чтобы сохранить графику видимой.Общей ошибкой, которую я нахожу в программах черепахи новичка, является создание бесконечного цикла активности черепах перед вызовом mainloop()
, а затем интересно, почему различные события не срабатывают.
Если вы планируете использовать Tk для обработки клавиатуры, мыши и событий таймера для вас, то вызов .mainloop()
- это то, как вы это запустили. В большинстве программ Python/Tk это последний оператор, но после него может быть другой код, который запускается, когда все окна Tk все закрыты.
Мы можем думать о программировании черепах как написании кода плагина для основного цикла Tk. После того, как мы установим, последующие действия будут выполняться с помощью функций обратного вызова, которые мы зарегистрировали через функции on*()
.
3. Я использовал mainloop() раньше. Мой вопрос, если у меня есть код FFG: ... Почему Алекс получить событие действия, когда функция да() запускается
Когда работает ваша программа, черепахи Алекс и Тессы сложены поверх друг друг в центре окна. Когда вы нажимаете на этот стежок черепахи, событие переходит к Tess, который находится сверху и имеет обработчик событий. В своем обработчике событий Тесс устанавливает обработчик событий на Alex. Акт установки обработчика событий на Alex заставляет Алекс двигаться перед Тесс, поднимаясь к вершине стека. С этого момента, когда вы нажимаете на стек черепахи, Алекс обрабатывает события, и они больше не доходят до Тесс. Мы можем видеть это ясно, если мы дадим им различные цвета и различные обработчики событий:
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()
Нажатие на стек черепахи производит:
> python3 test.py
Tess clicked
Alex clicked
Alex clicked
Alex clicked
Alex clicked
Alex clicked
Alex clicked
Вы могли двигаться Алекс и Тесс в разных местах, в окне и затем нажмите на них, чтобы подтвердить, что Алекс не начинает получать события до тех пор, пока не будет нажата Tess.
Возможно, код работает именно таким образом, но я не думаю, что так оно и должно было интерпретироваться. – Volcano
Я знаю, что инструкция печати кода не будет работать, пока вы не закроете окно черепахи, но это не та информация, которую я ищу. – Volcano
О, простите, это не помогло. Может быть, я не хорошо читаю ваш вопрос. Не могли бы вы объяснить, что вы ищете. – Neeks