![](/img/trans.png)
[英]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.