문제
어떤 키가 누르는 지 알아야하지만 캐릭터 코드가 필요하지 않아야합니다. 누군가가 'A'키를 누르면 'A'또는 'a'라는 경우에도 다른 모든 키를 사용하여 알고 싶습니다. .
피그 게임이나 다른 라이브러리 (Tkinter 포함)를 사용할 수 없습니다. Python 표준 라이브러리 만. 그리고 이것은 그래픽 인터페이스가 아닌 터미널에서 수행해야합니다.
문자 코드가 필요하지 않습니다. 키 코드를 알아야합니다.
전:
ord('a') != ord('A') # 97 != 65
someFunction('a') == someFunction('A') # a_code == A_code
해결책
보다 TTY 표준 모듈. 기본 라인 지향 (요리 된) 모드에서 char-oriented (cbreak) 모드로 전환 할 수 있습니다. tty.setcbreak (sys.stdin). sys.stdin에서 단일 char를 읽으면 다음 번 압박 키보드 키가 나옵니다 (코드를 생성하는 경우) :
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 (보다 그렇게 예를 들어) 와 함께 ReadConsoleInput
기능. 키 프레스를 걸러 내야합니다. e.EventType==KEY_EVENT
그리고 찾으십시오 e.Event.KeyEvent.wVirtualKeyCode
값. 응용 프로그램의 예 (Python이 아닌 아이디어를 얻기 위해)를 찾을 수 있습니다. http://www.benryves.com/tutorials/?t=winconsole&c=4.
다른 팁
당신이 달성하려는 것에 따라, 아마도 라이브러리를 사용하여 피그 게임 당신이 원하는 것을 할 것입니다. Pygame에는 Python의 표준 라이브러리에서 일반적으로 사용할 수있는 것보다 고급 키 프레스 처리가 포함되어 있습니다.
아마 사용해야 할 것입니다 티킨터, 이것은 '표준'Python Gui이며 수년 동안 Python에 포함되어 있습니다.
데이터가 명령 줄 프로세스 안팎으로 전달되는 방식으로 인해 명령 줄 솔루션을 사용할 수 없을 것입니다. GUI 프로그램 (일부 맛 또는 다른)은 모두 (아마도 라이브러리 랩핑 된) 이벤트 스트림을 통해 사용자 입력을받습니다. 각 이벤트는 이벤트의 세부 사항에 대한 기록입니다. KeyStroke 이벤트의 경우 레코드에는 일부 인코딩에 키 코드, 수정 자 키 비트 필드 또는 텍스트 문자가 포함될 수 있습니다. 어떤 필드와 이름이 지정되는지는 호출하는 이벤트 라이브러리에 따라 다릅니다.
명령 줄 프로그램은 문자 스트림을 통해 사용자 입력을받습니다. 하위 수준의 데이터를 포착 할 수있는 방법은 없습니다. Myroslav가 그의 게시물에서 설명했듯이, Tty 's는 요리하거나 요리되지 않은 모드로있을 수 있습니다. 유일한 차이점은 요리 된 모드에서 터미널이 삭제 및 입력과 같은 (일부) 제어 문자를 처리하여 프로세스가 입력 라인을받을 수 있도록 (일부) 제어 문자를 처리한다는 것입니다. 한 번에 1 자의.
(OS 종속) 시스템 호출을 요구하는 것보다 더 낮은 것을 처리하거나 /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 플랫폼에서 작동하는 Getch 함수의 구현입니다. 이 레시피를 기반으로합니다:
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())
이 방법은 훨씬 쉽고 외부 라이브러리를 가져올 필요가 없습니다.
질문에서 설명한 '일부 기능'이 되려면 두 가지 방법 중 하나를 선택해야합니다. 예는 다음과 같습니다.
산출:
# when using upCode():
>> upCcode('a')
65
>> upCcode('A')
65
# when using lowCode():
>> lowCcode('a')
97
>> lowCcode('A')
97
보세요 pynput 파이썬의 모듈. 그것은 또한 좋은 것입니다 지도 시간 이를 사용하여 코드에 대한 키보드 리스너를 쉽게 만들 수 있습니다.
청취자의 공식적인 예는 다음과 같습니다.
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()
도움이 되었기를 바랍니다.