擅长:python、mysql、java
<p>令人烦恼的是,虽然<code>Tk().willdispatch()</code>存在(尽管它似乎没有文档记录)撒谎说<code>mainloop</code>正在运行,而它没有运行(我使用它来允许<code>asyncio</code>任务将<code>asyncio</code>事件与<code>tkinter</code>事件交错,但它设置的底层标志(C级结构成员<code>dispatching</code>)没有Python级API</p>
<p>测试标志的唯一地方是在自动封送从非主线程到<code>mainloop</code>线程的调用的函数中,而将其用作检测机制并不实际(它只需要生成线程来执行测试,涉及超时,并在失败时抛出异常,即使您可以让它工作,也会让它变得丑陋)</p>
<p>简言之,它将由您负责。您可能使用的解决方案是创建一个子类,该子类拦截对<code>mainloop</code>的调用并记录已调用的调用:</p>
<pre><code>class CheckableTk(Tk):
def __init__(self, *args, **kwargs):
self.running = False
super().__init__(*args, **kwargs)
def mainloop(self, *args, **kwargs):
self.running = True
try:
return super().mainloop(*args, **kwargs)
finally:
self.running = False
def willdispatch(self, *args, **kwargs):
self.running = True # Lie just like willdispatch lies
return super().willdispatch(*args, **kwargs)
</code></pre>
<p>这不是一个很好的解决方案,我一般不鼓励这样做。真正的答案是,有一个,而且只有一个,运行<code>mainloop</code>的单一位置,而不是将可能的启动点分散到整个程序中</p>