有什么魔术可以阻止Tkinter程序在交互式shell中阻塞?

有什么魔术可以阻止Tkinter程序在交互式shell中阻塞?,第1张

有什么魔术可以阻止Tkinter程序在交互式shell中阻塞?

实际上,这并不是在这里重要的交互式解释器,而是在TTY上等待输入。您可以从如下脚本中获得相同的行为:

import tkintert = tkinter.Tk()input()

(在Windows上,您可能必须在pythonw.exe中而不是python.exe中运行该脚本,但是否则,您不必执行任何特殊 *** 作。)


那么它是怎样工作的?最终,诀窍归结为

PyOS_InputHook
-
readline
模块工作的方式相同。

如果stdin是TTY,则每次它尝试使用

input()
pre
模块的各个位,内置REPL等来获取一行时,Python都会调用已安装的任何内容,
PyOS_InputHook
而不仅仅是从stdin中读取。

它可能更容易理解什么

readline
呢:它试图
select
在标准输入或类似,循环为每个输入新的字符,或每0.1秒或每一个信号。

什么

Tkinter
确实是相似的。因为它必须处理Windows,所以它更加复杂,但是在*
nix上,它的行为与相似
readline
。除了
Tcl_DoOneEvent
每次在循环中都在调用。

这就是关键。

Tcl_DoOneEvent
重复调用与执行完全相同
mainloop

线程使一切变得更复杂,当然,但是让我们假设你还没有创建任何后台线程。在你真正的代码,如果你想创建后台线程,你只需要一个线程所有的

Tkinter
东西,上街区
mainloop
反正,
对?)


因此,只要您的Python代码将大部分时间都花在了TTY输入上(就像交互式解释器通常那样),则Tcl解释器会不断变化,而GUI也会响应。如果您在除TTY输入之外的其他位置上使Python解释器块阻塞,则Tcl解释器未运行,并且您的GUI没有响应。


如果您想在纯Python代码中手动执行相同的 *** 作怎么办?如果您想例如将Tkinter
GUI和

select
基于网络的客户端集成到单线程应用程序中,就需要这样做,对吗?

这很容易:从另一个驱动一个循环。

您可以

select
设置0.02s的超时(默认输入挂钩使用相同的超时),并在
t.dooneevent(Tkinter.DONT_WAIT)
每次循环中调用。

或者,您也可以通过致电来让Tk开车

mainloop
,但是请使用
after
和朋友来确保您
select
经常打电话。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5655237.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存