在特定时间执行事件

时间:2014-01-05 08:44:26

标签: python schedule

我有pygame代码在屏幕上显示内容。我面临的问题是如何在特定时间从文件到pygame代码生成事件。以下是我的pygame代码

 screen = pygame.display.set_mode([640,640])
 clock  = pygame.time.Clock()
 font   = pygame.font.SysFont("consolas", 25, True)
 pygame.display.set_caption("Test")
 count = 0
 done = False
 while not done:
     screen.fill(white)
     for event in pygame.event.get(): # User did something
         if event.type == pygame.QUIT: # If user clicked close
             done = True
     f=open('input.txt')
     lines=f.readlines()
     model_no = int(lines[0])
     f.close()

     out2 = "MODEL NO."
     text = font.render(out2,True,(253,15,21))
     screen.blit(text, [320,200])

     count += 1
     out5 = "ACTUAL          %s"  %count
     text = font.render(out5, True, Color('red'))
     screen.blit(text, [320,500])

     clock.tick(4)
     pygame.display.flip()

我有时间保存在文件中(例如'19:30:20')。如何在此特定时间生成事件,在再次开始递增之前将计数值重置为0。是否可以使用apscheduler来完成它?此外,文件中的时间可以改变,因此如果它改变,则应该在新的时间生成事件。任何可以帮助我解决问题的想法或解决方案?

2 个答案:

答案 0 :(得分:0)

从文件中读取您的时间并将当前时间转换为以相同方式格式化的字符串:

now = datetime.datetime.now()
string_now = now.strftime("%H:%M:%S")

然后使用循环检查当前时间是否等于触发时间:

while True:
        now = datetime.datetime.now()
        string_now = now.strftime("%H:%M:%S")
        string_from_file = "10:07:01"
        #trig_time = datetime.datetime.strptime(string_from_file, '%H:%M:%S')
        if string_now == string_from_file:
            print "*"*50
            print "Wahoo!"
            print "*"*50
            break
        else:
            print "Not time yet"
            continue

我可能会将上面的循环放在一个单独的线程或进程中并做一些事情来减慢速度。比如让它每分钟检查一次或每隔几分钟检查一次。但是如果你真的想检查并警告到第二个,那么你可能需要重新考虑一些部分。快速打开,读取和关闭文件只会导致问题。

您也可以使用实际的日期时间对象执行上述操作。将string_from_file转换为datetime对象,而不是将当前时间转换为字符串。然后对两个日期时间对象执行检查。 (请参阅我注释掉的行,将您的字符串转换为日期时间对象。

答案 1 :(得分:0)

catwalker333提供了不那么糟糕的答案。在我看来,主动等待会在Pascal中完成,而不是python。

我告诉你要计算从文件到“现在”的时刻之间的时间差。它会告诉你剩下多少时间,直到生成事件。从中减去几秒钟,使用time.sleep(time_difference),之后进行主动等待。

为什么我建议减少几秒?睡觉有点棘手,它可能不应该醒来(可能早一点,也许稍晚)。它适合长时间睡眠,不是非常精确的时间,但是当我们需要~1s的准确度时,不应该使用它。

你可以从文件中解析时间,如catwalker333所示,减法会给你一个timedelta,它会给你一些睡眠时间。


为什么睡不准确?

嗯,首先是GIL。它在睡觉时被释放,并且在醒来时获取它可能是不可用的,所以我们可能需要再等一会儿。

另一件事是计算时间。当你试图计算给定时间和“现在”时间之间的差异时,时间流动(该死的,与时间相关的时间太多“时间”:P),所以你应该睡得更少。少了多少?天知道,魔鬼怀疑。它随着每次运行而变化,并且非常难以预测。