2009-02-22 12 views
7

Muszę wiedzieć, który klawisz jest wciśnięty, ale nie potrzebuję kodu postaci, chcę wiedzieć, kiedy ktoś naciśnie klawisz "A", nawet jeśli kluczem uzyskanym jest "a" lub "A", a więc wszystkie pozostałe klucze.Jak uzyskać kody dostępu w Pythonie

Nie mogę używać PyGame ani żadnej innej biblioteki (w tym Tkintera). Tylko biblioteka standardowa Python. I to musi być zrobione w terminalu, a nie w interfejsie graficznym.

NIE POTRZEBUJE KODU CHARAKTERU. POTRZEBUJĘ WIEDZY O KODEKSU KLUCZOWYM.

Ex:

ord('a') != ord('A')      # 97 != 65 
someFunction('a') == someFunction('A') # a_code == A_code 
+0

lub terminal graficzny interfejs użytkownika? – iny

+0

Windows lub Linux? Zaktualizuj pytanie, zamiast dodawać kolejny komentarz. –

+0

Zaktualizuj swoje pytanie za pomocą znaczników "Edytuj", aby wyświetlić miejsce, w którym pojawiło się pytanie dodatkowe. – myroslav

Odpowiedz

20

Patrz standardowy moduł tty. Umożliwia przełączanie z domyślnego trybu liniowego (gotowanego) na tryb char (Cbreak) z tty.setcbreak(sys.stdin). Czytając jeden char z sys.stdin doprowadzi do następnego klawisza klawiatury prasowanego (jeśli generuje kod):

import sys 
import tty 
tty.setcbreak(sys.stdin) 
while True: 
    print ord(sys.stdin.read(1)) 

Uwaga: rozwiązanie jest Unix (w tym Linux) tylko.

Edytuj: W systemie Windows wypróbuj msvcrt.getche()/getwche()./Me ma nigdzie spróbować ...


Edit 2: Wykorzystaj win32 niskopoziomowe API konsoli poprzez ctypes.windll (patrz example at SO) z ReadConsoleInput funkcji. Należy odfiltrować naciśnięcia klawiszy - e.EventType==KEY_EVENT i poszukać wartości e.Event.KeyEvent.wVirtualKeyCode. Przykład zastosowania (nie w Pythonie, aby się zorientować) można znaleźć pod adresem http://www.benryves.com/tutorials/?t=winconsole&c=4.

+0

Powtórz, nie potrzebuję kodu postaci, potrzebuję KeyCode, naciśnięcie klawisza A lub SHIFT + A musi być takie samo. Użycie polecenia ord() zwróci jedną wartość oznaczającą A i inną z SHIFT + A; a klawisze takie jak strzały nie będą działać –

+0

Myślę, że pytanie, które zadajesz, jest zbyt niskie. To było ważne w DOS. W dzisiejszych czasach OS stosuje podejście mapowania klawiszy od kluczy do symboli, dzięki czemu można łatwo przełączać układy klawiatury (języki), przez co istnieje niewielka szansa na uzyskanie niskopoziomowych naciśnięć klawiszy. pygame obejście tego. – myroslav

+0

ok. dzięki. to jest to, co chcę wiedzieć. –

9

W zależności od tego, co chce osiągnąć, być może przy użyciu biblioteki takich jak pygame by robić to, co chcesz. Pygame zawiera bardziej zaawansowane manipulowanie naciśnięciami klawiszy niż normalnie dostępne w standardowych bibliotekach Pythona.

+0

dziękuję, ale nie muszę używać żadnej innej biblioteki niż standardowa biblioteka pythona. –

+1

OK. Pozostawiam tu odpowiedź (i nie usuwam jej), ponieważ może być przydatna dla kogoś, kto przychodzi tutaj, zadając podobne pytanie. –

+1

A do tego, kto to zajął: Pierwotne pytanie nie zawierało stwierdzenia, że ​​pygame jest nie do zaakceptowania. –

3

Prawdopodobnie będziesz musiał użyć Tkinter, który jest standardowym GUI Python i został dołączony do Pythona przez wiele lat.

Rozwiązanie wiersza polecenia prawdopodobnie nie jest dostępne ze względu na sposób, w jaki dane przechodzą do procesów wiersza polecenia i poza nimi. Programy GUI (o jakimś smaku lub innym) wszystkie otrzymują dane wejściowe użytkownika przez strumień zdarzeń (ewentualnie zawijany w bibliotekę). Każde wydarzenie będzie zapisem szczegółów wydarzenia. W przypadku zdarzeń związanych z naciśnięciami klawiszy rekord może zawierać dowolny kod, pole bitowe klucza modyfikującego lub znak tekstowy w niektórych kodowaniach. Które pola i jak są one nazwane, zależy od biblioteki zdarzeń, do której dzwonisz.

Programy z wiersza poleceń odbierają dane wprowadzane przez użytkownika za pośrednictwem strumieni znaków. Nie ma sposobu na złapanie danych niższego poziomu. Jak wyjaśnił miroslav w swoim poście, tty mogą być w gotowanym lub niegotowanym trybie, a jedyną różnicą jest to, że w trybie gotowanym terminal będzie przetwarzał (niektóre) znaki kontrolne dla ciebie, takie jak delete i enter, aby proces otrzymał linie danych wejściowych, zamiast tego 1 znak na raz.

Przetwarzanie czegokolwiek poniżej tego wymaga wywołań systemowych (zależnych od systemu operacyjnego) lub otwierania urządzeń znakowych w/dev. Standardowa biblioteka Pythona nie zapewnia standardowego narzędzia do tego.

0

Jeśli potrzebujesz pracować tylko w systemie Windows, powinieneś wypróbować msvcrt.

0

Oczywista odpowiedź:

someFunction = string.upper 

ord('a') != ord('A')      # 97 != 65 
someFunction('a') == someFunction('A') # a_code == A_code 

lub, innymi słowy (key):

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() 

etc ...

o to realizacja funkcji getch, które działa na platformach Windows i Linux, based on this recipe:

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() 
0

funkcja zwróci kod na wielką literą:

def upCcode(ch): 
    if(len(ch) == 1): 
     return ord(ch.upper()) 

i to jest dla małych liter kodu znaków:

def lowCcode(ch): 
     if(len(ch) == 1): 
      return ord(ch.lower()) 

ten sposób jest o wiele łatwiejsze i nie trzeba będzie do importuj biblioteki zewnętrzne.

Musisz wybrać jedną z dwóch metod, aby być "someFunction" opisanym w pytaniu. Oto przykład:

WYJŚCIE:

# when using upCode(): 
>> upCcode('a') 
65 

>> upCcode('A') 
65 

# when using lowCode(): 
>> lowCcode('a') 
97 

>> lowCcode('A') 
97 
Powiązane problemy