注意:这在某种程度上是对以下问题的跟进:Tkinter - 我什么时候需要调用 mainloop?
通常在使用Tkinter时,您调用Tk.mainloop来运行事件循环并确保事件得到正确处理并且窗口保持交互而不会阻塞。
在交互式 shell 中使用 Tkinter 时,似乎不需要运行主循环。举个例子:
>>> import tkinter
>>> t = tkinter.Tk()
将出现一个窗口,它不会阻塞:您可以与之交互,拖动它,然后关闭它。
因此,交互式 shell 中的某些东西似乎确实识别出一个窗口已创建并在后台运行事件循环。
现在来说有趣的事情。再次以上面的例子为例,但是在下一个提示符下(不关闭窗口),输入任何内容——不实际执行它(即不按回车键)。例如:
>>> t = tkinter.Tk()
>>> print('Not pressing enter now.') # not executing this
如果您现在尝试与 Tk 窗口交互,您会看到它完全阻塞了. 因此,当我们向交互式 shell 输入命令时,我们认为将在后台运行的事件循环停止了。如果我们发送输入的命令,您将看到事件循环继续,并且我们在阻塞期间所做的任何事情都将继续处理。
所以最大的问题是:交互式 shell 中发生的这种魔法是什么?当我们没有明确地执行主循环时,什么运行主循环?为什么当我们输入命令时它需要停止(而不是在我们执行它们时停止)?
注意:以上在命令行解释器中的工作方式是这样的,而不是 IDLE。至于 IDLE,我假设 GUI 实际上不会告诉底层解释器已经输入了某些内容,而只是将输入保留在本地,直到它被执行。