2014-03-13 44 views
4

所以我一直在做關於如何退出用戶while循環按下回車鍵讀了一點點,我想出了以下內容:按enter鍵退出while循環而不阻塞。我該如何改進這種方法?

import sys, select, os 

switch = 1 
i = 1 
while switch == 1: 
    os.system('cls' if os.name == 'nt' else 'clear') 
    print "I'm doing stuff. Press Enter to stop me!" 
    print i 
    while sys.stdin in select.select([sys.stdin], [], [], 0)[0]: 
     line = raw_input() 
     if not line: 
      print "Finished! =]" 
      switch = 0 
     else: 
      print "Finished! =]" 
      switch = 0 
    i = i+1 

有沒有一種辦法整理這個?特別是「如果不行」和下面的「其他」看起來很混亂。他們可以合併成一個嗎?使用「開關」更好的選擇?

最初,如果我鍵入了一串字符,然後按回車,它並沒有停止循環。我將不得不再次按下輸入。 if not和else組件用於設置它,以便在第一次輸入時退出。

+0

爲什麼不擺脫'if',因爲它以相同的方式?另外,「True」和「break」比標誌更乾淨 – jonrsharpe

+0

這是否確實適用於Windows?該文檔說select.select只支持Windows上的套接字:http://docs.python.org/2/library/select.html – Weeble

+0

@Weeble我認爲這應該適用於Windows? http://code.activestate.com/recipes/146066-exiting-a-loop-with-a-single-key-press/我在Ubuntu上編碼,親自。 – user3394391

回答

9

這爲我工作:

import sys, select, os 

i = 0 
while True: 
    os.system('cls' if os.name == 'nt' else 'clear') 
    print "I'm doing stuff. Press Enter to stop me!" 
    print i 
    if sys.stdin in select.select([sys.stdin], [], [], 0)[0]: 
     line = raw_input() 
     break 
    i += 1 

你只需要檢查標準輸入是輸入一次(因爲第一個輸入將終止循環)。如果條件行/不是行結果給你,你可以將它們合併成一個if語句。然後,只使用一個while聲明,您現在可以使用break而不是設置標誌。

+0

釘住它。謝謝! – user3394391

+0

事實上,事後看來,我意識到你甚至不需要'''如果行或不行'...它總是正確的。 – limasxgoesto0

+0

雖然您確實需要raw_input()調用,因爲如果用戶輸入除Enter之外的任何內容然後按下Enter鍵,則會引發NameError。 – limasxgoesto0