0

我正在尝试为我的控制台应用程序实现一个功能,该功能应该侦听按键,msvcrt.getwch() 但是当我与“输入”内置函数同时运行它时,某些东西会阻止在侦听器停止工作后输入的第一个字符显示在终端中。

即,如果我输入“asdf”并且“a”按键被 msvcrt.getwch() 捕获,则不会打印“s”(使用 python2.7、python3.6 测试):

C:\>keys.py
enter anything
keypress: a        # I pressed "a"
df                 # I pressed "s" "d" "f", but why "s" didn't show up here?
you entered: sdf   # note the "s" was captured by `input()` func

该程序:

import threading
import msvcrt
import time

def keypress_listener():
  key = msvcrt.getwch()
  print('keypress: '+key)

def start_keypress_listener():
  t = threading.Thread(target=keypress_listener)
  t.daemon = True
  t.start()

def input_prompt():
  i = input('enter anything\n')
  print('you entered: '+i)

def main():
  start_keypress_listener()
  time.sleep(1)
  input_prompt()

if __name__ == '__main__':
  main()
4

1 回答 1

0

当我运行您的程序并悠闲地输入asdf时,这是我得到的输出:

enter anything
keypress: a
df
you entered: sdf

这和你的一样。在不了解 Python 内部结构的情况下,很明显 Python 的input函数比函数具有“优先级”或运行在较低级别,getwch因此一旦函数input_prompt开始运行,它就会抓住之前getwch有机会获得的任何键盘输入。

于 2019-07-11T12:02:10.970 回答