首页 > 解决方案 > 我正在尝试像功能应用一样发出警报,但它一直在等待

问题描述

我正在尝试制作一个类似于应用程序的警报,我希望在该应用程序中列出时间发生的事情。但我面临一个错误。时间一直在等待上一个时间,而不是进入列表中的下一个时间。

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)

我之前尝试过发布问题,但无法正确解释。希望这可以帮助

标签: pythonarrays

解决方案


使用==运算符比较时间是有风险的,从逻辑上讲它应该可以工作,但不知何故最好使用<=运算符,如果您的时间大于列表中记录的时间,则最终比较!这比仅触发一次且无法保证拆分的平等安全得多

-->注意:我相信那些函数生成的不同格式的时间戳,虽然它们代表时间并且很有用,但由于它们采用不同的格式,你不能让相等运算符工作(Bcz即使是相同的时间和日期,你的时间戳也会不同,尽管它们代表相同)。要确认此行为,您可以编写t1datetime.now的打印变量并查看它们是否相同。

关于您的第二个问题,您可以使用 if/else语句来检查已经发生的时间以及刚刚超过的最近时间,或者您可以反向运行循环并检查计时器(假设迟到的计时器处于循环结束)

示例代码:

for elt in timetable.reverse():
    i_time = elt
    while True: 
        if i_time <= dt.datetime.now().time():
            print("Its time")
            break

推荐阅读