Robię program typu stoper w pythonie i chciałbym wiedzieć, jak wykryć, czy klawisz jest wciśnięty (np. P dla pauzy i s dla zatrzymania), a nie chciałbym, aby było to coś w rodzaju raw_input, które czeka na dane wejściowe użytkownika przed kontynuowaniem wykonywania. Czy ktoś wie, jak to zrobić w pętli while?
Chciałbym również stworzyć tę platformę wieloplatformową, ale jeśli nie jest to możliwe, moim głównym celem rozwoju jest linux
python
python-2.7
keypress
detect
lobuo
źródło
źródło
Odpowiedzi:
Python ma moduł klawiatury z wieloma funkcjami. Zainstaluj go, być może za pomocą tego polecenia:
Następnie użyj go w kodzie takim jak:
źródło
keyboard
najwyraźniej wymagaDla tych, którzy są na oknach i próbowali znaleźć działającą odpowiedź, oto moja: pynput
Powyższa funkcja wydrukuje dowolny klawisz, który naciśniesz, oraz rozpocznie akcję po zwolnieniu klawisza „esc”. Dokumentacja klawiatury jest tutaj dla bardziej zróżnicowanych zastosowań.
Markus von Broady zwrócił uwagę na potencjalny problem: Ta odpowiedź nie wymaga, abyś był w bieżącym oknie, aby ten skrypt został aktywowany, rozwiązaniem dla okien byłoby:
źródło
Jako OP wspomina o raw_input - to znaczy, że chce rozwiązania CLI. Linux: curses jest tym, czego chcesz (Windows PDCurses). Curses to graficzny interfejs API oprogramowania CLI, dzięki któremu można osiągnąć więcej niż tylko wykrywanie kluczowych zdarzeń.
Ten kod będzie wykrywał klawisze do momentu naciśnięcia nowej linii.
źródło
termios
i tak dalej ...import os
, aby móc wyjść z przykładu.win.nodelay(False)
zamiastTrue
, to nie będzie generował milion wyjątków na sekundę.Jest więcej rzeczy, które można zrobić z
keyboard
modułem.Oto kilka metod:
Metoda nr 1:
Korzystanie z funkcji
read_key()
:To przerwie pętlę po naciśnięciu pklawisza.
Metoda nr 2:
Korzystanie z funkcji
wait
:Będzie czekał, aż naciśniesz pi będzie kontynuował naciśnięcie kodu.
Metoda nr 3:
Korzystanie z funkcji
on_press_key
:Potrzebuje funkcji zwrotnej. Użyłem,
_
ponieważ funkcja klawiatury zwraca zdarzenie klawiatury do tej funkcji.Po wykonaniu uruchomi funkcję po naciśnięciu klawisza. Możesz zatrzymać wszystkie zaczepy, uruchamiając tę linię:
Metoda nr 4:
Na tę metodę w pewnym sensie odpowiedział już user8167727, ale nie zgadzam się z kodem, który stworzyli. Będzie używać funkcji,
is_pressed
ale w inny sposób:Po pnaciśnięciu nastąpi przerwanie pętli .
Uwagi:
keyboard
odczyta naciśnięcia klawiszy z całego systemu operacyjnego.keyboard
wymaga roota w systemie Linuxźródło
keyboard.wait()
czekania na więcej niż 1 klawisz i kontynuować, jeśli którykolwiek z nich zostanie naciśniętywait()
nie daje takiej funkcjonalności. Będziesz musiał użyćkeyboard.read_key()
warunku if spakowanego w pętli while. Zobacz metodę nr 1suppress
użycie słowa kluczowegokeyboard.read_key()
, kiedy go używać, a kiedy nie ...W przypadku systemu Windows możesz użyć
msvcrt
tego:źródło
Użyj tego kodu, aby znaleźć naciśnięty klawisz
źródło
Użyj PyGame, aby mieć okno, a następnie możesz uzyskać kluczowe wydarzenia.
Do listu
p
:źródło
Zrobiłem więc ten… rodzaj gry… na podstawie tego postu (używając biblioteki msvcr i Pythona 3.7).
Oto "główna funkcja" gry, czyli wykrywanie wciśniętych klawiszy:
Jeśli chcesz mieć pełny kod źródłowy porgramu, możesz go zobaczyć lub pobrać stąd:
The Secret Key Game (GitHub)
(uwaga: tajne naciśnięcie klawisza to: Ctrl+ F12)
Mam nadzieję, że możesz służyć jako przykład i pomóc tym, którzy przychodzą, aby zapoznać się z tymi informacjami.
źródło
Sugerowałbym użycie PyGame i dodanie uchwytu zdarzenia.
http://www.pygame.org/docs/ref/event.html
źródło
To pochodzi z pakietu openCV. Wykrywa naciśnięcie klawisza bez czekania.
źródło