检查输入任务的时间是否已过
Checking whether a time for an input task has passed
我正在尝试制作一个待办事项列表,您可以在其中通过 TKinter 输入格式为 'take out dog at 13:45' 的任务。然后我将任务中提到的时间作为日期时间对象处理,我将其与当前时间进行比较以查看任务是否到期。但是,我 运行 对它的结构遇到了一些麻烦。
我想让 sound_alarm 函数连续地 运行,以检查任务是否到期。但我不能用 while true: loop 来做到这一点,因为它会干扰 TKinter 的 root.mainloop()。
知道如何让它在您输入任务时,sound_alarm 函数从该点开始 运行ning 以检查是否有任何任务到期了吗?
这是我现在的代码:
import tkinter as tk
from tkinter import messagebox
import pickle
from datetime import datetime
root = tk.Tk()
root.title("To Do list")
def add_task():
task = entry_task.get()
if task != "":
listbox_task.insert(tk.END, task)
print(task)
entry_task.delete(0, tk.END)
else:
tk.messagebox.showwarning(title="Warning", message="Enter a task first")
def del_task():
try:
task_index = listbox_task.curselection()[0]
listbox_task.delete(task_index)
except:
tk.messagebox.showwarning(title="Warning", message="Select a task first")
def load_tasks():
try:
tasks = pickle.load(open("tasks.dat", "rb"))
listbox_task.delete(0, tk.END)
for task in tasks:
listbox_task.insert(tk.END, task)
except:
tk.messagebox.showwarning(title="Warning", message="Cannot find task file")
def save_tasks():
tasks = listbox_task.get(0, listbox_task.size())
pickle.dump(tasks, open("tasks.dat", "wb"))
def get_time_from_task(task):
time = task.split("at ", 1)[1]
datetime_time = datetime.strptime(time, '%H:%M').time()
return datetime_time
def sound_alarm():
tasks = listbox_task.get(0, listbox_task.size())
now = datetime.now().time()
for task in tasks:
datetime_time = get_time_from_task(task)
print(datetime_time, now)
if now > datetime_time:
print(task, "is due!")
frame_tasks = tk.Frame(root)
frame_tasks.pack()
listbox_task = tk.Listbox(frame_tasks, height=20, width=50)
listbox_task.pack(side=tk.LEFT)
scrollbar_tasks = tk.Scrollbar(frame_tasks)
scrollbar_tasks.pack(side=tk.RIGHT, fill=tk.Y)
listbox_task.config(yscrollcommand=scrollbar_tasks.set)
scrollbar_tasks.config(command=listbox_task.yview)
entry_task = tk.Entry(root, width=50)
entry_task.pack()
btn_add = tk.Button(root, text="Add task", width=48, command=add_task)
btn_add.pack()
btn_del = tk.Button(root, text="Delete task", width=48, command=del_task)
btn_del.pack()
btn_load = tk.Button(root, text="Load tasks", width=48, command=load_tasks)
btn_load.pack()
btn_save = tk.Button(root, text="Save tasks", width=48, command=save_tasks)
btn_save.pack()
root.mainloop()
您可以使用.after()
每分钟执行sound_alarm()
。
以下修改sound_alarm()
:
def sound_alarm():
tasks = listbox_task.get(0, "end")
now = datetime.now()
current_time = now.time()
for task in tasks:
task_time = get_time_from_task(task)
print(task_time, current_time)
if current_time > task_time:
print(task, "is due!")
# try to schedule next check at 0 second of next minute
delay = 60 - now.second
root.after(delay*1000, sound_alarm)
...
sound_alarm() # start the checking task
root.mainloop()
我正在尝试制作一个待办事项列表,您可以在其中通过 TKinter 输入格式为 'take out dog at 13:45' 的任务。然后我将任务中提到的时间作为日期时间对象处理,我将其与当前时间进行比较以查看任务是否到期。但是,我 运行 对它的结构遇到了一些麻烦。
我想让 sound_alarm 函数连续地 运行,以检查任务是否到期。但我不能用 while true: loop 来做到这一点,因为它会干扰 TKinter 的 root.mainloop()。
知道如何让它在您输入任务时,sound_alarm 函数从该点开始 运行ning 以检查是否有任何任务到期了吗?
这是我现在的代码:
import tkinter as tk
from tkinter import messagebox
import pickle
from datetime import datetime
root = tk.Tk()
root.title("To Do list")
def add_task():
task = entry_task.get()
if task != "":
listbox_task.insert(tk.END, task)
print(task)
entry_task.delete(0, tk.END)
else:
tk.messagebox.showwarning(title="Warning", message="Enter a task first")
def del_task():
try:
task_index = listbox_task.curselection()[0]
listbox_task.delete(task_index)
except:
tk.messagebox.showwarning(title="Warning", message="Select a task first")
def load_tasks():
try:
tasks = pickle.load(open("tasks.dat", "rb"))
listbox_task.delete(0, tk.END)
for task in tasks:
listbox_task.insert(tk.END, task)
except:
tk.messagebox.showwarning(title="Warning", message="Cannot find task file")
def save_tasks():
tasks = listbox_task.get(0, listbox_task.size())
pickle.dump(tasks, open("tasks.dat", "wb"))
def get_time_from_task(task):
time = task.split("at ", 1)[1]
datetime_time = datetime.strptime(time, '%H:%M').time()
return datetime_time
def sound_alarm():
tasks = listbox_task.get(0, listbox_task.size())
now = datetime.now().time()
for task in tasks:
datetime_time = get_time_from_task(task)
print(datetime_time, now)
if now > datetime_time:
print(task, "is due!")
frame_tasks = tk.Frame(root)
frame_tasks.pack()
listbox_task = tk.Listbox(frame_tasks, height=20, width=50)
listbox_task.pack(side=tk.LEFT)
scrollbar_tasks = tk.Scrollbar(frame_tasks)
scrollbar_tasks.pack(side=tk.RIGHT, fill=tk.Y)
listbox_task.config(yscrollcommand=scrollbar_tasks.set)
scrollbar_tasks.config(command=listbox_task.yview)
entry_task = tk.Entry(root, width=50)
entry_task.pack()
btn_add = tk.Button(root, text="Add task", width=48, command=add_task)
btn_add.pack()
btn_del = tk.Button(root, text="Delete task", width=48, command=del_task)
btn_del.pack()
btn_load = tk.Button(root, text="Load tasks", width=48, command=load_tasks)
btn_load.pack()
btn_save = tk.Button(root, text="Save tasks", width=48, command=save_tasks)
btn_save.pack()
root.mainloop()
您可以使用.after()
每分钟执行sound_alarm()
。
以下修改sound_alarm()
:
def sound_alarm():
tasks = listbox_task.get(0, "end")
now = datetime.now()
current_time = now.time()
for task in tasks:
task_time = get_time_from_task(task)
print(task_time, current_time)
if current_time > task_time:
print(task, "is due!")
# try to schedule next check at 0 second of next minute
delay = 60 - now.second
root.after(delay*1000, sound_alarm)
...
sound_alarm() # start the checking task
root.mainloop()