簡體   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