По сути, вызов mainloop такой же, как если бы вы добавили это в свой код вместо вызова mainloop()
:
while the_program_is_running():
event = wait_for_event()
process_the_event(event)
Как правило, mainloop()
следует вызывать ровно один раз послепользовательский интерфейс инициализирован, и вы готовы к тому, чтобы пользователь начал взаимодействовать с вашей программой.Когда он выходит, у вас обычно не будет кода после него, и ваша программа завершит работу.
Как контролировать / видеть, какой именно код повторяет mainloop () (где итолько tkinter?);
Я не знаю, что вы подразумеваете под «повторение».Он не запускает никакого кода, кроме своего внутреннего кода.Он просто ждет событий, а затем отправляет их обработчикам.
Как правильно прервать его и вернуться к нему из другой функции, если она сама этого не делает;
Это крайне редко можно сделать в работающей программе,Как правило, вызов mainloop
- это последнее, что делает ваша программа, прежде чем пользователь начнет с ней взаимодействовать, и как только она выйдет из вашей программы, закроется.
Однако, чтобы ответить на конкретный ответ, как прервать его, вы можете вызвать метод quit
корневого окна.Это приведет к тому, что последний вызов на mainloop()
вернется.
Какой код следует повторить?Все объекты tkinter или только обновление меняющихся?Вместо этого использовать какую-нибудь операцию обновления?
На этот вопрос сложно ответить, потому что он не имеет особого смысла.Когда вы вызываете mainloop()
, он будет следить за всеми событиями на всех объектах tkinter.
В чем разница между функциями tkinter.mainloop () и window.mainloop ()
Они имеют одинаковый эффект и поведение.Странно, но Tkinter решил сделать mainloop
доступным из любого виджета.Наиболее распространенный способ вызвать его - либо из самого модуля tkinter, либо из корневого окна.
Моя цель - просто несколько раз переместить круг на сто пикселей.
Обычный способ сделать это - создать функцию, которая перемещает его на сто пикселей.Затем эта функция (или вызывающая ее функция) может поставить себя в очередь событий для запуска в будущем.
Например, следующий код будет перемещать объект canvas на 100 пикселей каждую секунду.пока программа не выйдет:
def move_object():
the_canvas.move(item_id, 100, 0)
the_canvas.after(1000, move_object)
Когда она вызывается, она перемещает элемент на 100 пикселей вправо, а затем помещает новый вызов себе в очередь событий, которая будет взята и обработана.примерно за 1000 миллисекунд.
Существует множество рабочих примеров использования after
на этом сайте, включая вопрос, на который вы ссылаетесь в своем вопросе.
Кажется, все находится под mainloopИтак, все перерисовывается при каждом проходе?
Нет, не совсем. Единственными перерисовываемыми объектами являются вещи, которые необходимо перерисовать. Перемещение объектов на холсте, изменение размера окна, перетаскивание другого окна.поверх вашего окна и т. д. все помещают событие в очередь событий, которое сообщает tkinter «этот объект должен быть перерисован». Обработка этого события происходит автоматически.Томатически mainloop
.Если в вашем приложении ничего не происходит, ничего не перерисовывается mainloop.
Должно отображаться окно 1368 на 650, а не крошечное
Это потому, что выне дал главное окно размера.Вы дали холсту размер, но вы используете place
, который не приведет к увеличению или уменьшению содержащегося окна.Как новичок, вам следует полностью избегать place
и вместо этого использовать pack
или grid
, потому что pack
и grid
автоматически подгонят размер вашего окна под все, что внутри.
Пока это заманчивоиспользовать place
для его кажущейся простоты, в действительности это обычно требует от вас гораздо больше работы, чем если бы вы использовали один из других менеджеров геометрии, и это приводит к GUI, который не особенно реагирует на изменения.
while True:
Вы почти никогда не должны делать это в tkinter. Tkinter - и почти все программы, основанные на событиях - полагаются на постоянный поток событий. Когда у вас есть бесконечный цикл, он не может обрабатывать эти события. Вы можете сделать явный вызов для обновления экрана в цикле, но это неэффективно и его следует избегать. Если вам нужно периодически что-то делать, создайте функцию, которая инкапсулирует тело вашего цикла, а затем используйте after
, чтобы получить mainloop
, чтобы запустить его во время обработки событий.
window.after(1000)
Вы почти никогда не должны использовать after
без второго аргумента. Такое использование функционально ничем не отличается от вызова time.sleep(1)
тем, что оно mainloop
не позволяет обрабатывать события. Вы должны структурировать свой код так, чтобы mainloop
.
обрабатывал постоянный поток событий.
while True: ... window.mainloop()
Вы определенно должны избегать вызова mainloop
внутри цикла. Хорошо функционирующая программа tkinter должна вызывать mainloop()
ровно один раз.