[英]error when exiting tkinter window update and update_idletasks
[英]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中
一些注意事项:
我不确定从这里走到哪里,关于我可以研究的事情有什么指针吗?
编辑:因此,我经历并删除了所有对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.