簡體   English   中英

重新創建窗口小部件時,Tkinter窗口不斷崩潰

[英]Tkinter window keeps crashing when recreating widgets

我最近開始測試Tkinter,以制作可以掛接到API並向用戶提供該API數據樣本的簡單應用程序。 我想要做的一件事是讓該窗口偶爾刷新,更新信息,以使它永遠不會過時。

但是,看來tkinter窗口經常崩潰。 沒有錯誤或消息返回,只是在不穩定的時間變得沒有響應。 添加大量的小部件會使崩潰更早地發生,但是使用不同數量的小部件似乎最終都會發生崩潰。

為了使它每隔一段時間自動刷新一次,我設置了一個線程,該線程將調用tkinter App的redraw方法。 從我的研究中,我知道tkinter不是線程安全的,但是當我每30秒只有一個線程調用需要一段時間才能運行的redraw方法時,我認為這不是問題。

這是我的應用程序的最低版本,嘗試重新繪制幾次后會崩潰。 我的實際數據最終只有大約15個窗口小部件和崩潰,但是將數字提高到很高的值會使崩潰更早發生,並且更易於測試。

from Tkinter import *

from threading import Thread, Event

REFRESH_INTERVAL = 30

class App(Frame):

    names = ["test"] * 50

    def __init__(self, master):
        Frame.__init__(self, master)

        self.frame = master
        self.table = None
        self.redraw()


    def redraw(self):
        if self.table:
            self.table.destroy()

        new_frame = Frame(self.frame)
        new_frame.pack()
        self.table = new_frame

        for code in self.names:
            label = Label(new_frame, text=code)
            label.pack()


class Refresher(Thread):

    def __init__(self, event, app):
        Thread.__init__(self)
        self.stopped = event
        self.app = app

    def run(self):
        while not self.stopped.wait(REFRESH_INTERVAL):
            print("Refreshing...")
            self.app.redraw()


def main():
    root = Tk()
    app = App(root)
    app.pack(side=TOP, fill="both", expand=True)

    stop_flag = Event()
    refresher = Refresher(stop_flag, app)
    refresher.start()
    root.mainloop()
    stop_flag.set()


if __name__ == "__main__":
    main()

事實證明,Tkinter不喜歡像這樣的單獨線程進行調用。 相反,建議改用after方法。

這個答案對此進行了詳細介紹,但這實際上是延遲后調用函數的一種方式。 可以在發送時將其添加到我的重繪函數中,以不斷添加觸發器以在延遲后重新運行該函數。

def redraw(self):
    if self.table:
        self.table.destroy()

    new_frame = Frame(self.frame)
    new_frame.pack()
    self.table = new_frame

    for code in self.names:
        label = Label(new_frame, text=code)
        label.pack()
    self.master.after(REFRESH_INTERVAL, self.redraw)

暫無
暫無

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

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