2012-12-03 19 views
1

我有一個包含一些時間間隔事件的列表的文件。這裏是一個例子:如何重播事件列表一貫

0, Hello World 
0.5, Say Hi 
2, Say Bye 

我希望能夠重播這一系列事件。第一列是兩個連續事件之間的增量(第一啓動immendiately,第二發生0.5秒之後,第三個約2s後,...)

我怎麼能做到這一點在Windows上。有什麼可以確保我對時間非常準確?這個想法應該儘可能地接近您將會聽到的音樂,您不希望您的音頻事件發生在接近正確的時間,但只是準時。

回答

1

這可以容易地通過使用sleep函數從time模塊來完成。確切的代碼應該像這樣工作:

import time 

# Change data.txt to the name of your file 
data_file = open("data.txt", "r") 

# Get rid of blank lines (often the last line of the file) 
vals = [i for i in data_file.read().split('\n') if i] 

data_file.close() 

for i in vals: 
    i = i.split(',') 
    i[1] = i[1][1:] 
    time.sleep(float(i[0])) 

    print i[1] 

這是一個不完美的算法,但它應該給你如何可以做到這一點的想法。我們讀取文件,將它分割成一個換行符分隔的列表,然後通過每個逗號分隔的聯對睡眠指定的秒數,並打印指定的字符串。

+0

是的,我已經來翻過這一解決方案,但不知道如果我們能實現更精確的結果。 Timer api(據我所知)不足以正確模擬。我的簡單示例沒有顯示幕後的真實應用,但我確實需要Windows上的最佳準確性(這就是爲什麼我打算直接調用Win32 C api) – Dave

+0

我懷疑可能是這種情況。由於print語句需要花費時間(如同分割字符串一樣),所以此算法將不準確,因爲所需的時間總是稍長於文件中指定的時間。一個簡單的解決方案來自愛好者的遊戲編程。 他們的解決方案是在循環的開始記錄時間,並在循環結束(我們睡覺前),得到的開始和結束時間之間的差異,並減去從我們睡覺的量。這會給你一個更準確的(雖然技術上還不完美)的延遲。 –

1

您正在尋找在Python time.sleep(...)

如果您加載該文件的列表,然後打印值,

import time 

with open("datafile.txt", "r") as infile: 
    lines = infile.read().split('\n') 

    for line in lines: 
     wait, response = line.split(',') 
     time.sleep(float(wait)) 
     print response 
+0

請參閱我對麥克斯韋答案的評論。您的解決方案正常工作,但不確定我的問題的準確性部分。 – Dave

+0

在這種情況下,您最好的選擇可能是函數式編程 - 將這些函數作爲您正在執行的任何操作的一部分進行調用,以確保完善的計時 - 僅當調用函數結束時纔會調用函數確保您不必手動排列'time.sleep'句點。這是真正做到這一點的唯一方法。 – jdotjdot