繁体   English   中英

当我调用update_idletasks()时,Tkinter有时会冻结

[英]Tkinter is sometimes freezing when I call update_idletasks()

我正在组装一个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秒内。 挂起发生在mainloop update_idletasks中

一些注意事项:

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

我不确定从这里走到哪里,关于我可以研究的事情有什么指针吗?

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

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

在此处输入图片说明

在挂起的运行中,所有内容看起来都是相同的,除了使用方法“ call”花费大约1000ms而不是花费25000ms或更长时间,而调用“ call”的次数大致相同。

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

不想打电话给update / update_idletasks如果你有一个持续的事件循环运行。 这些函数是持久事件循环的替代方法

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

因此,在将我的头撞到桌子上很多次之后,我想我明白了。 首先,似乎tkinter加载小部件的速度很慢,不确定这是否是因为我有多少个小部件(加载的每一帧不是全部,可能少于100个,也许少于50个)或由于我正在做的所有子类化(可能比我应该做的还要多)。 它令人烦恼,但目前仍可行。

解决临时冻结问题的方法是停止使用tkcalender datepicker小部件。 一旦我将其切换为基于条目和基于框架的自定义小部件,事情就停止了冻结,现在每次加载框架所需的时间几乎相同,虽然仍然很慢,但始终如一,这是我真正需要的目前。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM