`input`如何替代tkinter mainloop?

时间:2017-05-21 20:43:32

标签: python tkinter gnome-terminal

从这个问题: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调用。 inputmainloop行为相似,但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和交互式解释器的内部工作,那将更容易理解。

这似乎是重复的,我希望这个问题能够补充前一个问题并为其添加更多说明。

0 个答案:

没有答案