gpt4 book ai didi

python - 具有多个回调函数和使用 after() 的 Tkinter 问题

转载 作者:太空宇宙 更新时间:2023-11-04 10:13:18 28 4
gpt4 key购买 nike

我正在编写一段很长的代码,并且我想在多个窗口中多次进行 GUI 输入。

代码太长,放在这里意义不大,但我的代码布局如下:


callback1():
do something<p></p>

<pre><code>tkinter stuff, using callback1()
...
lots of other code (none to do with tkinter)
...

callback2():
do something else

tkinter stuff using callback2()

some more code (none to do with tkinter)

mainloop()
</code></pre>

<p></p>

抱歉结构模糊,但这或多或少是我代码的布局。但问题是,似乎永远不会到达 mainloop(),而我在回调之间的其他代码依赖于来自 GUI 的输入,因此它崩溃了。

我试过:


callback1():
do something
after(500, callback1)<p></p>

<pre><code>tkinter stuff, using callback1()
...
lots of other code (none to do with tkinter)
...

callback2():
do something else
after(500, callback1)

tkinter stuff using callback2()

some more code (none to do with tkinter)

after(0, callback1)
after(0, callback2)
mainloop()
</code></pre>

<p></p>

但是运气不好。任何人都可以帮助我正确使用 after() (或任何其他功能)以便我可以显示 GUI 吗?

最佳答案

像 tkinter 这样的 GUI 框架是事件驱动的。它们在启动 mainloop() 时开始运行。在此之前的一切基本上都是设置和内务处理。

主循环启动后,它们运行的​​唯一的代码片段是您附加到界面元素(如按钮)或使用after 计时器的回调。

这些回调必须相对较短,不应花费很长时间。 GUI 工具包调用您提供的函数来处理主循环中的事件。因此,当您的回调运行时,没有进一步的事件被处理并且 GUI 被有效地卡住。如果这只需要一小会儿(比如说 50 毫秒),就没有人会注意到。但是,如果您想运行需要几秒钟才能完成的计算,则不能在不卡住 GUI 的情况下在回调中执行此操作。

您可以考虑在第二个线程中执行长时间运行的作业。但在 CPython 中,由于技术原因,一次只能有一个线程执行 Python 字节码。然而(尤其是在 Python 3 中)线程被迫定期放弃 CPU,因此这可能是一个可行的解决方案。

另一种解决方案是使用 multiprocessing 将长时间运行的作业分配给单独的进程。在这种情况下,您必须通过例如在进程之间建立通信。一个队列

关于python - 具有多个回调函数和使用 after() 的 Tkinter 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36991061/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com