Python Tkinter在使用""更新标签后一段时间冻结方法

时间:2016-01-06 08:12:57

标签: python tkinter tk

我使用ttktkinter)的after方法实时更新/创建一些标签。我已经调整了这个SO question的代码但是我注意到一段时间后屏幕停止响应。我不确定多久但是当我启动程序时,一切似乎都运行良好。当我在没有关闭UI的情况下睡觉时,返回时会冻结并在几秒钟后解冻,让我在冻结前几秒钟进行交互。

我不知道导致这种行为的原因,但我怀疑是在哪里进行sqlite查询以显示数据库中的总记录。或者我可能在一个函数中做了太多的标签更新。请参阅下面的update_lbl方法。

有关尝试实现的内容的预览,请参阅image

class ReptoUI(ttk.Notebook):
    def __init__(self, parent):
        ttk.Notebook.__init__(self, parent)
        self.parent = parent

        self.parent.title("Repto Mail Checker")

        self.frame1 = ttk.Frame(self.parent, borderwidth=2, relief='groove')  # first page,
        self.frame1.grid(column=0, row=0, sticky=(N, S, E, W))

        self.con()  # configure columns
        self.frame2 = ttk.Frame(self.parent, borderwidth=2, relief='raised')  # second page,
        self.frame2.grid(column=9, row=11, columnspan=11, rowspan=11)
        self.add(self.frame1, text="Checker")
        self.add(self.frame2, text="Sender")

        self.mail_server = StringVar()
        self.mail_port = IntVar()
        self.protocol = StringVar()
        self.folder = StringVar()
        self.mail_type = StringVar()

        self.username = StringVar()
        self.password = StringVar()
        self.log_checker = BooleanVar()
        self.interval = IntVar()

        self.initUI()
        self.centerWindow()

    def con(self):
        for i in range(11):
            self.frame1.grid_columnconfigure(i, weight=1)
            # self.frame1.grid_rowconfigure(i, weight=1)


    def update_lbl(self):
        session = setup_db()
        total = session.query(Contact).count() # my guess is here
        allcountlbl = ttk.Label(self.frame1, text=total)
        allcountlbl.grid(column=7, row=4)

        if not self.username.get():
            username = ''
        else:
            username = self.username.get()

        # if isinstance(username, StringVar):
        #     username = ""

        if not self.folder.get():
            folder = self.folder
        else:
            folder = self.folder.get()
        print type(username)

        addrlbl = ttk.Label(self.frame1, text=username)
        addrlbl.grid(column=2, row=4)

        dirlbl = ttk.Label(self.frame1, text=folder)
        dirlbl.grid(column=4, row=4, sticky=W)
        self.frame1.after(1000, self.update_lbl)
    def statusUI(self):

        workinglbl = ttk.Label(self.frame1, text="Working on:")
        workinglbl.grid(column=1, row=4)
        self.update_lbl()

        boxlbl = ttk.Label(self.frame1, text="Folder:")
        boxlbl.grid(column=3, row=4)
    def initUI(self):
        # First page design tab/frame f1
        self.serverUI()
        self.mailUI()
        self.startUI()
        self.statusUI()

修改 这是调用setup_db时发生的情况。 我不确定sqlalchemy是否处理连接关闭,因为我可以执行session.close()engine.dispose()

的不同变体
def setup_db():
    engine = create_engine('sqlite:///records.db')
    Base.metadata.bind = engine
    DBSession = sessionmaker(bind=engine)
    session = DBSession()
    return session

1 个答案:

答案 0 :(得分:1)

虽然可能不是导致问题的唯一原因,但是你有各种各样的内存泄漏。每秒你都会创建三个新标签。这意味着只需10分钟就可以创建1,800个标签小部件。虽然我认为tkinter可以处理几千个小部件,但是你每小时创造的数量超过10,000个。

您应该只创建一次标签,然后仅在每秒调用的函数中更改其text属性。

您可能也应该将session = setup_db()移出循环。我怀疑有必要每秒创建一个新的会话。创建一个整个程序生命周期的会话。