如何使用可选输入制作一个While

时间:2017-03-24 17:50:53

标签: python windows python-3.x input while-loop

如何使用我无法等待回答的输入进行while循环? (Python 3.6 Windows 10)
例如:

b = 0
While True:
     b += 1
     a = input('wating',b)
     if a == '1': print('Great!')
     time.sleep(1)

这将打印:

1
2
3
4
     # But if a write 1 then it would print
5
Great!

嗯,这只是我想要做的一个例子,事实上我想做一个简单游戏的while循环菜单(简单因为它是一个shell游戏,没有图形),当你在菜单,每秒(即使你没有做任何事情)游戏检查你是否写了一些东西(输入)和(即使你在输入中写或不写东西)检查你的统计数据(减少你的食物和增加你当前的生命值)。
对不起我的英文,感谢您的阅读。

编辑:

我在stackoverflow中发现了这两个方法,它们哪个更好?我不理解他们中的任何一个,有人可以解释他们的工作以及他们之间有什么不同吗? (#comments我不能制作它们)

第一

import msvcrt
import time
import sys

class TimeoutExpired(Exception):
    pass

answer = ''
def input_with_timeout(prompt, timeout, timer=time.monotonic):
    sys.stdout.write(prompt)
    sys.stdout.flush()
    endtime = timer() + timeout
    result = []
    while timer() < endtime:
        if msvcrt.kbhit():
            result.append(msvcrt.getwche()) #XXX can it block on multibyte characters?
            if result[-1] == '\n':   #XXX check what Windows returns here
                return ''.join(result[:-1])
            time.sleep(0.04) # just to yield to other processes/threads            
    raise TimeoutExpired

try:
   answer = input_with_timeout('hi', 4)
except TimeoutExpired:
    print('Sorry, times up')
else:
   print('Got %r' % answer)

第二

import sys
import time
import msvcrt

def readInput( caption, default, timeout = 2):
    start_time = time.time()
    sys.stdout.write('%s(%s):'%(caption, default))
    sys.stdout.flush()
    input = ''
    while True:
        if msvcrt.kbhit():
            byte_arr = msvcrt.getche()
            if ord(byte_arr) == 13: # enter_key
                break
            elif ord(byte_arr) >= 32: #space_char
                input += "".join(map(chr,byte_arr))
        if len(input) == 0 and (time.time() - start_time) > timeout:
            print("timing out, using default value.")
            break

    print('')  # needed to move to next line
    if len(input) > 0:
        return input
    else:
        return default

# and some examples of usage
ans = readInput('Please type a name', 'john') 
print( 'The name is %s' % ans)

1 个答案:

答案 0 :(得分:0)

基于this answers我刚刚发现了一种方法来解决这个问题:

import msvcrt
while True:
    if msvcrt.kbhit():
        my_input = input()

msvcrt提供了能够处理关键输入的函数列表。 msvcrt.kbhit()检查按键是否被按下并等待读取并返回true或false,在按下按键后循环&#34;停止&#34;直到输入完成,但在此之后循环保持&#34;循环&#34;没有停止(直到再次按下一个键)。