题
我必须知道按下了什么键,但不需要角色的代码,我想知道何时有人按下“A”键,即使获得的键是“a”或“A”,所有其他键也是如此。
我无法使用 PyGame 或任何其他库(包括 Tkinter)。只有Python标准库。这必须在终端中完成,而不是图形界面。
不需要字符代码。我需要知道关键代码。
前任:
ord('a') != ord('A') # 97 != 65
someFunction('a') == someFunction('A') # a_code == A_code
解决方案
看 终端 标准模块。它允许从默认的面向行(cooked)模式切换到面向字符(cbreak)模式 tty.setcbreak(sys.stdin). 。从 sys.stdin 读取单个字符将导致下一个按下的键盘键(如果它生成代码):
import sys
import tty
tty.setcbreak(sys.stdin)
while True:
print ord(sys.stdin.read(1))
笔记:解决方案仅限于 Unix(包括 Linux)。
编辑:在 Windows 上尝试 msvcrt.getche()/getwche(). 。/我无处可尝试...
编辑2:通过以下方式利用 win32 低级控制台 API ctypes.windll (看 SO的例子) 和 ReadConsoleInput
功能。你应该过滤掉按键 - e.EventType==KEY_EVENT
并寻找 e.Event.KeyEvent.wVirtualKeyCode
价值。应用程序示例(不是Python,只是为了了解一下)可以在以下位置找到: http://www.benryves.com/tutorials/?t=winconsole&c=4.
其他提示
根据您正在试图完成什么,也许是使用库如 pygame的会做你想要什么。 Pygame的包含更高级的按键操作比通常用Python的标准库。
您可能要使用 Tkinter的,这是 '标准' 的Python的GUI,并已被列入与Python多年。
一个命令行的解决方案可能不可用,因为数据通过流入和流出的命令行过程的方法。 GUI程序(的某些味道或其他)中的所有收到的用户输入通过一个(可能库包裹)的事件流。每个事件将成为该活动的详细信息记录。对于按键事件,该记录将可能包含的任何一个键码,修改键位字段,或者在某些编码文本字符。哪些字段,以及它们如何被命名取决于您所呼叫的事件库。
命令行程序收到通过字符流的用户输入。有没有办法赶上低层次的数据。作为myroslav在他的岗位说明,TTY的可在烹煮或未经烹煮模式,唯一的区别是,在烹调模式的终端将处理(一些)控制字符为你,就像删除,并输入使过程接收输入行,而不是的在时间1个字符。
处理任何低于需要(取决于操作系统)的系统调用或开口字符设备/ dev中。 Python的标准库提供没有标准设施此。
如果您需要在窗口工作的只有你应该尝试 MSVCRT 。
显而易见的答案:
someFunction = string.upper
ord('a') != ord('A') # 97 != 65
someFunction('a') == someFunction('A') # a_code == A_code
,或者在其他(关键)词:
char_from_user = getch().upper() # read a char converting to uppercase
if char == 'Q':
# quit
exit = True # or something
elif char in ['A', 'K']:
do_something()
等...
下面是残培功能的实现,这将在Windows和Linux平台上工作,基础的在此配方:
class _Getch(object):
"""Gets a single character from standard input.
Does not echo to the screen."""
def __init__(self):
try:
self.impl = _GetchWindows()
except ImportError:
self.impl = _GetchUnix()
def __call__(self):
return self.impl()
class _GetchUnix(object):
def __init__(self):
import tty, sys
def __call__(self):
import sys, tty, termios
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
try:
tty.setraw(sys.stdin.fileno())
ch = sys.stdin.read(1)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return ch
class _GetchWindows(object):
def __init__(self):
import msvcrt
def __call__(self):
import msvcrt
return msvcrt.getch()
getch = _Getch()
该函数将返回代码为大写字符:
def upCcode( ch ):
if(len(ch) == 1):
return ord(ch.upper())
和这对小写字符代码:
def lowCcode( ch ):
if(len(ch) == 1):
return ord(ch.lower())
这种方式容易得多,你将不需要导入外部库。
您需要选择两种方法之一是你在你的问题中描述的“someFunction”。下面是一个例子:
输出:
# when using upCode():
>> upCcode('a')
65
>> upCcode('A')
65
# when using lowCode():
>> lowCcode('a')
97
>> lowCcode('A')
97
看一看 pynput 在Python模块。它也有一个很好的教程使用它您可以轻松地创建您的代码键盘监听器。
对于听众的官方的例子是:
from pynput.keyboard import Key, Listener
def on_press(key):
print('{0} pressed'.format(
key))
def on_release(key):
print('{0} release'.format(
key))
if key == Key.esc:
# Stop listener
return False
# Collect events until released
with Listener(on_press=on_press,
on_release=on_release) as listener:
listener.join()
希望这有助于。