Примечание. Это несколько продолжение вопроса: 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, я предполагаю, что GUI обычно не говорит интерпретатору, что что-то было введено, а просто локально хранит входной файл до его выполнения.