python - 我正在尝试像功能应用一样发出警报,但它一直在等待
问题描述
我正在尝试制作一个类似于应用程序的警报,我希望在该应用程序中列出时间发生的事情。但我面临一个错误。时间一直在等待上一个时间,而不是进入列表中的下一个时间。
t1 = dt.time(hour=17,minute=8)
t2 = dt.time(hour=18,minute=48)
timetable = [t1, t2]
for elt in timetable:
i_time = elt
#i_minute = i.minute
while True:
if i_time == dt.datetime.now().time():
#if i_hour == dt.datetime.now().hour and i_minute == dt.datetime.now().minute:
#current_time = tk.Label(text = dt.datetime.now())
#current_time.pack()
#playsound('media/ClassAlarm.mp3')
print("Its time")
break
该功能在 t1 时工作正常,但如果 t1 已过且当前时间高于 t1,则应转到 t2 并响铃。但它一直在等待第二天发生的 t1。除非处理 t1,否则它不会读取 t2。
前任。当前时间为 1:30,而 t1 为 1:25,t2 为 1:35。它不会在 t2 响起,而是一直等待 t1 再次发生,这已经发生了。
我试图以不同的方式执行 for 循环
for elt in timetable:
time = dt.datetime.now().time()
if time - elt < 0:
break
while(True):
if time == elt:
print("you did it")
我也试过any()
方法。这也没有帮助
current_hour = dt.datetime.now().hour
current_min = dt.datetime.now().minute
alarm = any(i.hour == current_hour and i.minute == current_min for i in timetable)
print(alarm)
我之前尝试过发布问题,但无法正确解释。希望这可以帮助
解决方案
使用==运算符比较时间是有风险的,从逻辑上讲它应该可以工作,但不知何故最好使用<=运算符,如果您的时间大于列表中记录的时间,则最终比较!这比仅触发一次且无法保证拆分的平等安全得多
-->注意:我相信那些函数生成的不同格式的时间戳,虽然它们代表时间并且很有用,但由于它们采用不同的格式,你不能让相等运算符工作(Bcz即使是相同的时间和日期,你的时间戳也会不同,尽管它们代表相同)。要确认此行为,您可以编写t1和datetime.now的打印变量并查看它们是否相同。
关于您的第二个问题,您可以使用 if/else语句来检查已经发生的时间以及刚刚超过的最近时间,或者您可以反向运行循环并检查计时器(假设迟到的计时器处于循环结束)
示例代码:
for elt in timetable.reverse():
i_time = elt
while True:
if i_time <= dt.datetime.now().time():
print("Its time")
break
推荐阅读
- python-3.x - 无法在 Django 模板中发布所需的数据
- mysql - 从 XBSTREAM(版本 5.6.50)恢复 AWS RDS 不起作用
- python - 芹菜不并行执行块组
- asp.net-core - Net Core 请求模型更改十进制值
- elasticsearch - 如何使用logstash在elasticsearch中上传csv文件?
- groovy - 删除第一个和最后一个字符 Groovy
- javascript - 如何以编程方式在输入单击时留下 Ant Design 选择?
- python - 有没有办法根据特定列的值剪辑整行?
- sql - 我需要用 ms sql 请求中的字符串格式替换值 NULL
- project-reactor - Resilience4j 速率限制器在项目反应堆中无法正常工作?