2014-01-05 129 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") 

然後使用一個循環來檢查當前時間達到TRIG時間:

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對象行。

+0

我已經嘗試過您的方法,但它不起作用。我把循環放在單獨的線程中,但它錯過了時間。因此問題是我應該減慢多少,以便它不會錯過。另外,我需要大約1秒的準確度。 – prattom

+0

以上內容絕對有效,我猜測還有其他的事情發生。你有可能發佈更多的代碼嗎?我認爲可能有一些棘手的部分1)讓你的重置標誌回到你的主代碼重置計數器2)確保'string_now'和'string_from_file'具有相同的格式3)確保你得到正確的線從你的文件,其中包含你的時間後 – catwalker333

0

catwalker333提供不那麼糟糕的答案。在我看來,積極的等待會做帕斯卡的伎倆,而不是Python。

我'告訴你計算從文件到「現在」之間的時間差,它會告訴你剩下多少時間,直到產生事件爲止,從中抽象幾秒鐘,使用time.sleep(time_difference),然後進行主動等待

爲什麼我建議減去幾秒鐘?睡覺有點棘手,它可能不會醒來,當它應該(也許早一點,也許稍後)。它睡覺很長,不是真的,精確的時間量,但當我們需要〜1s的準確度時不應該使用。

如catwalker333所示,你可以從文件中解析時間,而減法會給你一個timedelta,它會給你睡眠秒數。


爲什麼睡眠不準確?

那麼,首先是GIL。它在睡覺時被釋放,並且在喚醒時可能無法獲取它,所以我們可能需要等一會兒。

另一件事是計算時間。當你試圖計算給定時間與「現在」時間之間的差異時,時間流逝(該死的太多時間與時間有關的序列:P),所以你應該睡更少的時間。少了多少?天知道,魔鬼嫌疑犯。它隨每次運行而變化,並且非常不可預測。

+0

問題是我需要一個精度約1秒 – prattom

+0

因此,如果事件應該在7PM生成,並且是5PM睡眠1小時59分40秒,比去活動等待是時候產生你的事件了。您將花費更多時間使用處理器,並且需要準確性。 –