我有一个持续运行的程序,定期读取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')))