![](/img/trans.png)
[英]error when exiting tkinter window update and update_idletasks
[英]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.