从这个问题:What magic prevents Tkinter programs from blocking in interactive shell?由@abarnert回答:
如果stdin是TTY,那么,每次它尝试获取
input()
的行,code
模块的各个位,内置的REPL等,Python调用任何已安装的PyOS_InputHook
,而不是只读取标准输入。*
Tkinter
的作用与此类似。它更复杂,因为它必须处理Windows,但在 nix它做了与readline
非常相似的事情。除非它每次都通过循环调用Tcl_DoOneEvent
。
我对这种行为感到困惑。 input
与{tninter}的mainloop
完全相同,因此Tcl_DoOneEvent
不会被input
调用。 input
和mainloop
行为相似,但input
调用PyOS_InputHook
而不是Tcl_DoOneEvent
,这是可以理解的。
在以交互方式运行Python的交互式shell中,我使用gnome-terminal
,运行此脚本:
#main.py
from tkinter import *
win = Tk()
Button(win, command=(lambda:print('pressed'))).pack(side=TOP)
执行文件:
$python3 -i main.py
>>> print("something") # I didn't press enter here
我在屏幕上显示窗口并按下按钮2次这是我在终端中获得的内容:
>>> print("something")pressed
pressed
按下后输入窗口响应事件,再次在终端:
>>> print("something")pressed
pressed
something
>>> pressed
当然,input
中没有main.py
,但以交互方式运行Python解释器确实证明了这一点。通常,input
和交互式解释器如何避免调用Tk.mainloop()
的需要?
编辑:
如果有人能够通过伪代码或Python代码向我们展示input
和交互式解释器的内部工作,那将更容易理解。
这似乎是重复的,我希望这个问题能够补充前一个问题并为其添加更多说明。