2017-01-25 8 views
1

В следующей программе, которую я запускаю на Windows 7 Professional 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 - это только среда разработки. Если вы планируете использовать консольный скрипт , вы можете макетировать поддельные функции ввода-вывода консоли для использования при тестировании, когда нет подключенной консоли (например, 'open (« CONIN $ »)' fail). Если это не sup представляя собой консольную программу, затем используйте инструментарий GUI для создания собственного окна и чтения ввода с клавиатуры. – eryksun

ответ

0

Мне удалось решить эту проблему. Процесс kbhit не работал в IDLE, который я использовал (Wing IDE), но работал, если вызван из командной строки (это может применяться, как сказал @eryksun, ко всем IDLE, а не только к Wing). Другая проблема, которую я обнаружил, заключается в том, что процесс getch() не выполняет то, что мне нужно, и что мне нужно использовать getwch(), который возвращает unicode. С еще одной незначительной корректировкой (неплатежеспособной decision с decision = '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

Вы используете , сравнивая переменное решение и строку "repeat" во внутреннем цикле, поскольку вы используете == operator. Вы должны использовать = вместо этого, чтобы присвоить значение переменной:

decision = 'repeat' 
+0

Спасибо, что заметили это. Я исправил его, но он не имел никакого отношения к внутренней петле. Я также изменил набор циклов 'for' в строки, чтобы разрешить запуск кода. –

+0

Вы уверены, что 'msvcrt.getch()' возвращает '\ r'? – Reaper

+0

Кажется, это то, что ожидается, когда вы нажмете ENTER на Windows. Это то, что я использовал в коде. –

 Смежные вопросы

  • Нет связанных вопросов^_^