我一直在尝试(供我个人使用)一些人['定时键盘输入的解决方案和唯一有效的键盘输入是Alex Martelli / martineau here.我使用了他们的第二个代码块(从导入msvcrt开始),除了比较之外,几乎所有东西都很好用。如果没有及时输入输入,我用空字符串替换了None的返回,我使用了一些测试行,如下所示:
import msvcrt
import time
def raw_input_with_timeout(prompt, timeout):
print prompt,
finishat = time.time() + timeout
result = []
while True:
if msvcrt.kbhit():
result.append(msvcrt.getche())
if result[-1] == '\r': # or \n, whatever Win returns;-)
return ''.join(result)
time.sleep(0.1) # just to yield to other processes/threads
else:
if time.time() > finishat:
return ""
textVar = raw_input_with_timeout("Enter here: \n", 5)
print str(textVar) # to make sure the string is being stored
print type(str(textVar)) # to make sure it is of type string and can be compared
print str(str(textVar) == "test")
time.sleep(10) # so I can see the output
用pyinstaller编译后,运行它,然后在窗口中键入test,我得到这个输出:
Enter here:
test
test
<type 'str'>
False
我原本认为比较是返回False,因为函数会将字符附加到数组中,这可能与它没有与字符串进行正确比较有关,但是在深入研究Python的工作方式之后(即SilentGhost的回复here),我真的不知道为什么比较不会返回True。任何回应表示赞赏。谢谢!
答案 0 :(得分:2)
仅通过打印,您将无法看到字符串的不同之处。字符串值可以包含打印时在控制台上不容易看到的字节。
使用repr()
function生成调试友好的表示。此表示形式将字符串格式化为Python字符串文字,仅使用可打印的ASCII字符和转义序列:
>>> foo = 'test\t\n'
>>> print foo
test
>>> foo == 'test'
False
>>> print repr(foo)
'test\t\n'
在您的情况下,您的包括返回值中的\r
回车符:
if result[-1] == '\r':
return ''.join(result)
最后\r
仍然存在,因此您至少获得了值'test\r'
,但在打印时不会显示\r
:
>>> print 'test\r'
test
>>> print repr('test\r')
'test\r'
通过切换字符串,您可以在加入时排除最后一个字符:
return ''.join(result[:-1])
或者您可以使用str.strip()
从字符串的开头和结尾删除所有空格字符(包括\r
字符):
return ''.join(result).strip()
请注意,此处使用str()
来电是没有意义的。您返回str
个对象,因此str(textVar)
是多余的。此外,print
会在任何字符串对象上调用str()
。
答案 1 :(得分:1)
如果你考虑这段代码:
result = []
while True:
if msvcrt.kbhit():
result.append(msvcrt.getche())
if result[-1] == '\r': # or \n, whatever Win returns;-)
return ''.join(result)
您可以看到,在构建输入字符串时,用户输入的最终字符必须是\r
,这是与回车符对应的不可打印字符。因此,返回的输入字符串如下所示:
test\r
我认为您需要修改代码以从输入中丢弃最终的不可打印字符。
答案 2 :(得分:0)
字符串后面可能有一些看不见的字节。尝试print([c for c in textVar])
,如果它显示字符谎言'\r'
和\n
,请尝试str(textVar).strip() == "test"
或手动删除这些字符。