繁体   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