Python “input”如何替代tkinter mainloop?

Python “input”如何替代tkinter mainloop?,python,tkinter,gnome-terminal,Python,Tkinter,Gnome Terminal,由@abarnert回答的问题: 如果stdin是一个TTY,那么每当它试图用input()、code模块的各种位、内置的REPL等来获取一行时,Python都会调用任何已安装的PyOS\u InputHook,而不仅仅是从stdin读取 *Tkinter的作用类似。它更复杂,因为它必须处理Windows,但在nix上,它所做的事情与readline非常相似。除了每次通过循环调用Tcl\u DoOneEvent 我被这种行为弄糊涂了input与tkinter的main loop不完全相同,因此,

由@abarnert回答的问题:

如果stdin是一个TTY,那么每当它试图用
input()
code
模块的各种位、内置的REPL等来获取一行时,Python都会调用任何已安装的
PyOS\u InputHook
,而不仅仅是从stdin读取

*
Tkinter
的作用类似。它更复杂,因为它必须处理Windows,但在nix上,它所做的事情与
readline
非常相似。除了每次通过循环调用
Tcl\u DoOneEvent

我被这种行为弄糊涂了
input
与tkinter的
main loop
不完全相同,因此,
input
不会调用
Tcl\u DoOneEvent
。可以理解的是,
input
mainloop
的行为类似,但是
input
调用
PyOS\u InputHook
而不是
Tcl\u DoOneEvent

在交互式运行Python时的交互式shell中,我使用
gnome终端
,运行以下脚本:

#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
按enter键后,窗口将再次响应终端中的事件:

>>> print("something")pressed
pressed

something
>>> pressed
当然,在
main.py
中没有
input
,但是以交互方式运行Python解释器确实证明了这一点。一般来说,
input
和交互式解释器如何避免调用
Tk.mainloop()

编辑: 如果有人能向我们展示
input
的内部工作原理,以及使用伪代码或Python代码的交互式解释器,那就更容易理解了


这似乎是一个重复的问题,我希望这个问题将补充上一个问题,并对其进行更多的澄清

我看不出这个问题与另一个问题有什么不同。@BryanOakley我忘了在我的问题中包括一件事,所以我编辑了这个问题:编辑:如果有人能向我们展示
input
的内部工作原理,以及带有伪代码或Python代码的交互式解释器,那就更容易理解了。也是在我的第一段:我被这种行为弄糊涂了<代码>输入与
mainloop
不完全相同。。。我陈述了我的困惑。事实证明,在幕后,
\u tkinter.c
覆盖了
PyOS\u InputHook
,将解释器的提示与其事件循环集成在一起: