2017-01-25 70 views
1

在下面的程序中,我在Windows 7專業版64上運行,我嘗試允許用戶在需要時進行干預(通過內部while循環)並導致外部while循環重複一個動作。否則,內部while循環會超時,該程序將只是繼續暢通無阻:在Python循環中重複超時或用戶輸入

import msvcrt 
import time 

decision = 'do not repeat' # default setting 

for f in ['f1', 'f2', 'f3']: 

    print ('doing some prepartory actions on f') 

    while True: # outer while loop to allow repeating actions on f 

     print ('doing some more actions on f') 

     t0 = time.time() 
     while time.time() - t0 < 10:  # inner while loop to allow user to intervene 
      if msvcrt.kbhit():    # and repeat actions by pressing ENTER if 
       if msvcrt.getch() == '\r': # needed or allow timeout continuation 
        decision = "repeat" 
        break 
       else: 
        break 
      time.sleep(0.1) 

     if decision == "repeat": 
      print ("Repeating f in the outer while loop...") 
      continue 

     else: 
      break 

    print ('doing final actions on f in the for loop') 

但是,用戶輸入部分內環的(按ENTER鍵重複)不工作,我不知道爲什麼。我從here提供的解決方案中獲得了它的想法。 關於如何讓這個工作的任何想法?

+1

'kbhit'和'getch'需要被連接到控制檯窗口的過程。如果你使用IDLE ,那麼該進程沒有控制檯 - 至少在使用pythonw.exe運行默認方式時,即使你使用連接的控制檯運行IDLE(例如,使用Win + R運行對話框運行py-3 -m idlelib'),我懷疑你希望用戶不得不切換到控制檯窗口來輸入輸入 – eryksun

+1

無論如何,IDLE和其他IDE shell只是開發環境,如果你打算將它作爲控制檯腳本,如果沒有連接的控制檯(例如'open(「CONIN $」)'失敗),你可以模擬假的控制檯I/O函數以用於測試。如果它不是sup構成一個控制檯程序,然後使用GUI工具包創建自己的窗口並閱讀鍵盤輸入。 – eryksun

回答

0

我現在設法解決了這個問題。 kbhit進程在我使用的IDLE(Wing IDE)中不起作用,但如果在命令提示符下調用(這可能適用於@eryksun所說的,適用於所有IDLE而不僅僅是Wing)。我發現的另一個問題是getch()進程沒有做我需要的,我必須使用返回unicode的getwch()。有了一個更小的調整(默認decisiondecision = 'Reset decision to not repeat',現在的代碼是在良好的工作秩序。

import msvcrt 
import time 

decision = 'do not repeat' # default setting 

for f in ['f1', 'f2', 'f3']: 

    print ('doing some prepartory actions on f') 

    while True: # outer while loop to allow repeating actions on f 

     print ('doing some more actions on f') 

     t0 = time.time() 
     while time.time() - t0 < 10:  # inner while loop to allow user to intervene 
      if msvcrt.kbhit():    # and repeat actions by pressing ENTER if 
       if msvcrt.getchw() == '\r': # needed or allow timeout continuation 
        decision = "repeat" 
        break 
       else: 
        break 
      time.sleep(0.5) 

     if decision == "repeat": 
      print ("Repeating f in the outer while loop...") 
      decision = 'Reset decision to not repeat' 
      continue 

     else: 
      break 

    print ('doing final actions on f in the for loop') 
1

你是比較變量的決定和字符串「重複」在你的內部循環,因爲你正在使用==操作符。您應該使用=代替爲變量賦值:

decision = 'repeat' 
+0

謝謝你注意到這一點。我修好了它,但它對內圈沒有任何影響。我還將'for'循環設置爲字符串以允許代碼運行。 –

+0

你確定'msvcrt.getch()'返回'\ r'嗎? – Reaper

+0

看來這是在Windows上按下ENTER時預計會返回的內容。這就是我借用的代碼。 –