tkinter如何防止主窗口在长时间运行的程序中冻结?

时间:2017-12-14 10:30:17

标签: python tkinter

我有一个持续运行的程序,定期读取sqlite数据库。它调用一个函数,通过检查某些条件在tkinter窗口中显示消息,然后它进入休眠状态。我的问题是当我尝试关闭它时窗口冻结(使用quit()方法)。可能是,在这种情况下,root.mainloop()不是程序的最后一个陈述。 (我需要定期显示一个弹出窗口。)

我认为多线程不是解决方案,因为tkinter不应该在单独的线程中运行。

解决这个问题的正确方法是什么?

以下是代码 -

def display_reminders(task_names):

    root = Tk()

    root.title('Reminder')
    root.geometry('-0-40')
    root.minsize(width=300,height=100)
    root.attributes("-topmost", True)
    root.rowconfigure(0, weight=1)
    root.columnconfigure(0, weight=1)

    for key, name, dt in task_names:
        Label(root, text=name).grid(padx=20, pady=20, sticky=NW)
    btn = Button(root, text='Ok', command=root.quit)
    btn.grid(pady=5)
    btn.bind('<Return>', lambda e: root.quit())

    root.mainloop()


def check_for_reminders(missed_flag=False):

    # logic to read database and check if reminder should be displayed

    display_reminders(task_names)

check_for_reminders(True)
time.sleep(60 - int(datetime.datetime.now().strftime('%S')))
while True:
    check_for_reminders()
    # We subtract the number of seconds from 60 because having only
    # time.sleep(60) results in the number of seconds past the minute creeping
    # up.
    time.sleep(60 - int(datetime.datetime.now().strftime('%S'))) 

0 个答案:

没有答案