簡體   English   中英

如果使用update_idletasks而不是update,則Tkinter窗口將掛起

[英]Tkinter window got hung if update_idletasks is used instead of update

我已經開發了一個應用程序,可以在磁盤上復制文件並在Tkinter GUI中顯示其進度。 它使用定制的shutil模塊復制文件。 如果我直接使用自定義的復制功能(無GUI)復制文件,則它將正確復制所有文件並顯示要復制文件的消息(已使用要復制的打印語句)。 現在的問題是,當我使用GUI執行相同的操作時,它在一段時間后掛起。

我正在使用文本小部件來顯示正在復制的文件的運行日志。 基本上,在調用復制函數之前,我已經重定向了stdout,並且我正在使用“ update_idletasks”來更新GUI。

class TextRedirector(object):
    def __init__(self, widget, tag="stdout"):
        self.widget = widget
        self.tag = tag

    def write(self, str):
         self.widget.configure(state="normal")
         self.widget.insert("end", str, (self.tag,))
         self.widget.update_idletasks()
         self.widget.see('end')
         self.widget.configure(state="disabled")

查詢1:“文本”小部件中的文本大小是否有限制? 我應該在代碼中尋找什么來解決此掛起問題。

Query2:我已經注意到,一旦調用了復制功能,我將無法使用“最小化”按鈕,只有在此操作結束后才能使用它。 就我而言,我需要復制大量數據,因此我想最小化該應用程序並繼續進行其他工作。

更新:

如果我使用“ update”方法而不是“ update_idletasks”,則將解決我的兩個查詢。 現在我的問題是為什么它不能與“ update_idletasks”一起使用。 據我所知,它還用於刷新GUI事件。

文本小部件中沒有實際的大小限制。

沒有看到您實際上是如何復制數據的,就不可能確定,但​​是您是否知道Tkinter是單線程的? 如果您的命令花費很長時間,則GUI將掛起,直到該操作完成。 這是因為所有GUI操作都是通過響應事件發生的,並且在運行任何單獨的命令時,事件循環都無法響應事件。

解決方法是讓長時間運行的操作在線程或單獨的進程中運行。 或者,您可以重構該功能,以便可以在事件循環的每次迭代中完成少量工作。 請注意,如果使用線程,則無法從該其他線程直接寫入GUI小部件。 您必須使用線程安全隊列在線程之間發送數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM