2015-07-04 55 views
3

我有一個連續的循環,修改數組中的數據並在每個循環中暫停一秒。這是沒有問題的..但我也需要在特定的按鍵輸入時將數組的特定部分打印到屏幕上,而不中斷以一秒間隔運行的連續循環。按鍵上的斷開循環

關於如何在不破壞循環的情況下獲得按鍵的任何想法?

+0

我從來沒有做過這樣的窗口系統之外,但這個帖子似乎相關:http://stackoverflow.com/問題/ 12175964/python-method-for-reading-keypress – user2027202827

回答

1

您可以使用multiprocessingthreading庫來產生將運行連續循環的新進程/線程,並通過讀取用戶輸入來繼續主流程(將數組的特定部分打印到屏幕等)。

例子:

import threading 

def loop(): 
    for i in range(3): 
     print "running in a loop" 
     sleep(3) 
    print "success" 

if __name__ == '__main__': 

    t = threading.Thread(target=loop) 
    t.start() 
    user_input = raw_input("Please enter a value:") 
    print user_input 
    t.join() 
+0

這看起來像是我所需要的。你有一個解釋這個問題的文檔,或者你至少可以解釋target = loop部分嗎? –

+0

@StevenLutz'target = loop'意味着當調用'start()'函數時,會生成的線程將運行函數'loop()'。 join()意味着等待線程完成任務。 – alfasin

+0

我現在對此有所瞭解。但我還有最後一個問題。看看這個代碼: 進口螺紋 導入時間 DEF迴路(): 計數= 0 而真: 計數+ = 1個 打印 「這是一個循環」 time.sleep(1) 打印「成功」 如果__name__ == '__main__': T = threading.Thread(目標=循環) t.start() 而真: USER_INPUT的raw_input =( 「請輸入一個值:」) 打印「用戶輸入:」+ user_input print「Current count:」+ count t.join() 如何讓count在線程之外傳遞?我得到一個計數沒有定義的錯誤。 –

1

你可能尋找select模塊。 Here's關於等待I/O的教程。

對於做對按鍵的東西,你可以使用類似的目的:

import sys 
from select import select 

# Main loop 
while True: 
    # Check if something has been input. If so, exit. 
    if sys.stdin in select([sys.stdin, ], [], [], 0)[0]: 
     # Absorb the input 
     inpt = sys.stdin.readline() 
     # Do something... 
+0

對不起,我想我沒有完全讀你的問題。這告訴你如何打破循環,但不知道如何保持一秒鐘的時間間隔。如果你做了其他的事情,你不會倒計時,所以你可能還需要產生一個新的過程或其他東西,正如另一個答案所建議的。雖然這個答案可能還是有一定價值的。 – Praveen