Примечание. Это своего рода продолжение вопроса: Tkinter - когда мне нужно вызывать mainloop?
Обычно при использовании Tkinter вы вызываете Tk.mainloop, чтобы запустить цикл событий и убедиться, что события обрабатываются должным образом, а окна остаются интерактивными без блокировки .
При использовании Tkinter из интерактивной оболочки запуск основного цикла не кажется необходимым. Возьмем этот пример:
>>> import tkinter
>>> t = tkinter.Tk()
Появится окно, и оно не будет блокироваться: вы можете взаимодействовать с ним, перетаскивать его и закрывать.
Итак, что-то в интерактивной оболочке, кажется, распознает, что окно было создано, и запускает цикл обработки событий в фоновом режиме.
Теперь самое интересное. Снова возьмите пример сверху, но затем в следующем приглашении (не закрывая окно) введите что-нибудь, не выполняя его (т.е. не нажимайте ввод). Например:
>>> t = tkinter.Tk()
>>> print('Not pressing enter now.') # not executing this
Если вы сейчас попытаетесь взаимодействовать с окном Tk, вы увидите, что оно полностью блокирует. Таким образом, цикл обработки событий, который, как мы думали, будет работать в фоновом режиме, остановился, пока мы вводили команду в интерактивную оболочку. Если мы отправим введенную команду, вы увидите, что цикл событий продолжается, и все, что мы делали во время блокировки, продолжится.
Итак, большой вопрос: Что это за магия, которая происходит в интерактивной оболочке? Что запускает основной цикл, когда мы не делаем этого явно? И почему он должен останавливаться, когда мы вводим команды (вместо того, чтобы останавливаться, когда мы их выполняем)?
Примечание. Вышеуказанное работает так же в интерпретаторе командной строки, а не в IDLE. Что касается IDLE, я предполагаю, что графический интерфейс на самом деле не сообщает базовому интерпретатору, что что-то было введено, а просто сохраняет ввод локально, пока он не будет выполнен.
pythonw
, в OS X это то, что заставляет значок приложения внезапно появляется в вашем Доке, на большинстве систем * nix / X11 он более незаметен), это некрасиво. - person abarnert   schedule 03.01.2014import tkinter; tk=tkinter.Tk(); input()
(как скрипт, а не в интерактивном интерпретаторе), Python запустит комбинированный цикл GUI и stdin, а это все, что нужно для получения Tcl работает, пока ожидает вашегоinput
. - person abarnert   schedule 03.01.2014