문제

어떤 키가 누르는 지 알아야하지만 캐릭터 코드가 필요하지 않아야합니다. 누군가가 '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()

도움이 되었기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top