gpt4 book ai didi

python - 当我调用 update_idletasks() 时,Tkinter 有时会卡住

转载 作者:太空宇宙 更新时间:2023-11-03 20:59:34 24 4
gpt4 key购买 nike

我正在组装一个 tkinter gui 应用程序,有时在加载新框架并将其添加到笔记本时,gui 会在调用更新时卡住。我不确定要为代码提供什么,我有很多子类化正在进行,所以发布所有这些都会变得荒谬,而且我不确定它是否有用。

def _handle_events_button(self):
ntbk = self.find_notebook()
print("1: " + str(int(time.time())))
w = EventListDetailsCombo(ntbk)
print("2: " + str(int(time.time())))
w.load()
print("3: " + str(int(time.time())))
w.add_to_notebook(ntbk)
print("4: " + str(int(time.time())))
# clipboard.root.update_idletasks()
print("5: " + str(int(time.time())))
ntbk.select(w)
print("6: " + str(int(time.time())))

打印的输出是这样的:

# Working correctly 
1: 1555952235
2: 1555952235
3: 1555952235
4: 1555952235
5: 1555952237
6: 1555952237

# Hang / Delay
1: 1555952240
2: 1555952240
3: 1555952240
4: 1555952240
5: 1555952266
6: 1555952266

即使用 update_idletasks() 而不使用 update_idletasks(),所有这些输出彼此之间的间隔在 1-2 秒内。挂起发生在主循环 update_idletasks

一些注意事项:

  • 它不会一直卡住,看起来很随机,但似乎每 4 到 5 次尝试就会发生一次。
  • 卡住的长度似乎也是随机的,有时是 30 秒,有时是几分钟。
  • 如果我在卡住时单击其他按钮,它将在卡住停止后执行这些操作
  • 通常,如果我从 pycharm 终止应用程序,框架将在应用程序终止之前加载一秒钟。

我不知道从这里该去哪里,有什么关于我可以调查的事情的指示吗?

编辑:所以我经历并删除了所有更新调用,现在它只是在这段代码之后挂起,我假设在主循环更新步骤中,但我不太确定如何检查该假设,这个 _handle_events_button 函数被调用直接从事件按钮,因此此后不应再有我的代码。

编辑2:如果我保留 update_idletasks 并在其上运行分析器,当它正常工作时,它看起来像这样:

enter image description here

在它挂起的运行中,一切看起来都一样,除了方法“call”花费大约 1000 毫秒,而是花费 25000 毫秒或更多,对“call”的调用次数大致相同。

编辑3:我已在打印语句的输出中添加了内容。另外,我不能将这个函数中的任何一个放入单独的线程中,因为它只是准备小部件。

最佳答案

如果您正在运行持久事件循环,您不想调用update/update_idletasksThese functions are the alternative to a persistent event loop.

当您从事件处理程序调用它时,您实际上是在运行一个临时嵌套事件循环。这会阻塞代码,直到处理所有适用的待处理事件 - 并且还可能产生其他不良副作用,因为当前事件处理程序应该执行的操作只完成了一半,并且其他代码可能会看到应用程序处于不一致的状态。

关于python - 当我调用 update_idletasks() 时,Tkinter 有时会卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55796812/

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