Каждый учебник по tkinter, который я видел, утверждает, что tkinter.mainloop
должен вызываться для рисования окон и обработки событий, и они всегда вызывают эту функцию, даже в программах hello world. Однако, когда я пробую их в интерактивной оболочке, окна рисуются правильно без необходимости вызова mainloop. Этот пример встраивания графики matplotlib в tkinter создает относительно сложное приложение, с кнопками для панорамирования, масштабирования и изменения размера графика в окне tkinter, и опять же, все это работает, если убрать вызов mainloop и запустить код в интерактивной оболочке. Конечно, если я запускаю скрипт (с удаленным mainloop) вне интерактивной оболочки, программа завершается слишком быстро, чтобы увидеть, что происходит, но если я добавляю вызов input
, чтобы держать программу открытой, все работает правильно (я использую python 3.2.2 на linux).
Так что же именно делает mainloop, и когда его нужно вызывать?
EDIT: Чтобы уточнить, если я открою терминал GNOME и наберу
$python3
>>> import tkinter
>>> root = tkinter.Tk()
mainloop, то сразу же появится окно без необходимости вызова mainloop, и более сложные функции tkinter, похоже, тоже работают (например, добавление кнопок в окно). В IDLE вызов mainloop необходим. Насколько я понимаю, ничего не должно рисоваться и никакие события не должны обрабатываться, пока не будет вызван mainloop.