2014-01-05 1 views
0

У меня есть код 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 и как? Также время в файле может измениться, если оно изменится, событие должно быть сгенерировано в новое время. Любые идеи или решения, которые могут помочь мне решить мою проблему?

+0

Есть ли причина, по которой время находится в файле? Было бы намного проще обрабатывать время, если бы оно было переменной, тогда вам не нужно продолжать проверять файл, чтобы увидеть, изменяется ли он. – jonrsharpe

+0

Да, этот код фактически выполняет работу по отображению вещей, пока время получено от клиента серверным приложением, которое сохраняет его в файл. – prattom

+0

ОК, если мне удалось обработать время как переменную, то как я могу генерировать событие в это конкретное время, чтобы сделать значение счета 0. – prattom

ответ

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 

Я бы, вероятно, поставил вышеуказанный цикл в отдельный поток или процесс и сделал что-то, чтобы замедлить его. Например, проверяйте его один раз в минуту или раз в несколько минут. Но если вы действительно хотите проверить и предупредить до второго, вам может потребоваться переосмыслить некоторые части. Открытие, чтение и закрытие файла это быстро вызовет проблемы.

Вы также можете сделать то же, что и выше, с фактическими объектами datetime. Вместо преобразования текущего времени в строку преобразуйте файл string_from_file в объект datetime. Затем выполните проверки против двух объектов datetime. (См линию я комментировал, чтобы преобразовать строку в объект DateTime.

+0

Я уже пробовал свой метод, но он не работает. Я поместил цикл в отдельный поток, но он пропустил время. Таким образом, вопрос заключается в том, сколько я должен замедлить его, чтобы он не пропустил. Кроме того, мне нужна точность ~ 1 секунда – prattom

+0

Вышеупомянутая определенность работает сама по себе, я предполагаю, что происходит что-то еще. Есть ли вероятность, что вы сможете разместить больше своего кода? Я думаю, что может быть пара сложных частей: 1) получение флага возврата к вам основного кода для сброса счетчика; 2) убедитесь, что «string_now» и «string_from_file» имеют одинаковый формат. 3) убедитесь, что вы получаете правильную строку из вашего файла, который содержит время после – catwalker333

0

catwalker333 при условии не очень плохой ответ. На мой взгляд, активное ожидание будет делать трюк в Pascal, а не питона.

I 'd рассказать вам рассчитать разницу во времени между моментом из файла и «сейчас». Он расскажет вам, сколько осталось времени, пока не будет создано событие. Substract в несколько секунд от него, используйте time.sleep(time_difference), а после этого выполните активное ожидание

Почему я предлагаю вычесть несколько секунд? Сон - это просто сложно, МОЖЕТ НЕ проснуться, когда это нужно (может быть, немного раньше, может быть, немного позже). Хорошо спать долго, точное количество времени, но не должно использоваться, когда нам нужна точность ~ 1 с.

Вы можете анализировать время из файла, как показано catwalker333, а вычитание даст вам timedelta, что даст вам количество секунд для сна.


Почему не спит точным?

Ну, во-первых, это GIL. Он высвобождается во время сна, и его приобретение может быть недоступным в момент пробуждения, поэтому нам, возможно, придется подождать немного дольше.

Другое дело - время вычислений. Когда вы пытаетесь вычислить разницу между заданным временем и временем «сейчас», время течет (проклятое, слишком много «времени» во временной последовательности: P), поэтому вы должны спать еще меньше времени. Насколько меньше? Бог знает, подозревают дьявол. Он варьируется в зависимости от каждого пробега и довольно непредсказуем.

+0

Проблема в том, что мне нужна точность ~ 1 секунда – prattom

+0

Итак, если событие должно быть сгенерировано при 7PM, и это 5PM спящий на 1 час 59 минут и 40 секунд, чем перейти к активному пока не наступит время для создания вашего мероприятия. Вы потратите больше времени на использование процессора и получите точность. –