it-swarm.com.de

tastendruck in Python erkennen?

Ich mache ein Stoppuhrprogramm in Python und würde gerne wissen, wie man erkennt, ob eine Taste gedrückt wird (z. B. p für Pause und s für Stopp), und ich möchte nicht, dass es so etwas wie raw_input ist, das auf den Benutzereingabe, bevor die Ausführung fortgesetzt wird. Weiß jemand, wie man das in einer while-Schleife macht?

Ich möchte diese Plattform auch plattformübergreifend machen, aber wenn das nicht möglich ist, dann ist mein Hauptentwicklungsziel Linux

32
lobuo

Python hat ein keyboard Modul mit vielen Funktionen. Installieren Sie es vielleicht mit diesem Befehl: 

pip3 install keyboard

Dann verwenden Sie es im Code wie:

import keyboard  # using module keyboard
while True:  # making a loop
    try:  # used try so that if user pressed other than the given key error will not be shown
        if keyboard.is_pressed('q'):  # if key 'q' is pressed 
            print('You Pressed A Key!')
            break  # finishing the loop
        else:
            pass
    except:
        break  # if user pressed a key other than the given key the loop will break
24
user8167727

Als OP-Erwähnung über raw_input - das heißt, er will cli-Lösung. Linux: curses ist das, was Sie wollen (windows PDCurses). Curses, ist eine grafische API für CLI-Software. Sie können mehr als nur wichtige Ereignisse erkennen.

Dieser Code erkennt Tasten, bis eine neue Zeile gedrückt wird.

import curses
import os

def main(win):
    win.nodelay(True)
    key=""
    win.clear()                
    win.addstr("Detected key:")
    while 1:          
        try:                 
           key = win.getkey()         
           win.clear()                
           win.addstr("Detected key:")
           win.addstr(str(key)) 
           if key == os.linesep:
              break           
        except Exception as e:
           # No input   
           pass         

curses.wrapper(main)
12
Abc Xyz

Für Windows können Sie msvcrt folgendermaßen verwenden:

   import msvcrt
   while True:
       if msvcrt.kbhit():
           key = msvcrt.getch()
           print(key)   # just to show the result
7
Benjie

Für diejenigen, die unter Windows sind und Schwierigkeiten hatten, eine funktionierende Antwort zu finden, hier meine: 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()

Die Funktion oben druckt, welche Taste Sie gerade drücken und startet eine Aktion, sobald Sie die 'esc'-Taste loslassen. Die Tastaturdokumentation ist hier für eine unterschiedlichere Verwendung.

5
Mitrek

Verwenden Sie PyGame, um ein Fenster zu haben, und Sie können die Schlüsselereignisse abrufen.

Für den Brief p:

import pygame, sys
import pygame.locals

pygame.init()
BLACK = (0,0,0)
WIDTH = 1280
HEIGHT = 1024
windowSurface = pygame.display.set_mode((WIDTH, HEIGHT), 0, 32)

windowSurface.fill(BLACK)

while True:
    for event in pygame.event.get():
        if event.key == pygame.K_p:
             #Do what you want to here
             pass
        if event.type == pygame.locals.QUIT:
             pygame.quit()
             sys.exit()
3
A.J. Uppal

Mit dem Modul keyboard können noch weitere Dinge erledigt werden.

Hier sind einige der Methoden:


Methode 1:

Verwendung der Funktion read_key():

import keyboard

while True:
    if keyboard.read_key() == "p":
        print("You pressed p")
        break

Dies wird die Schleife unterbrechen, wenn p gedrückt wird.


Methode 2:

Mit der Funktion wait:

import keyboard

keyboard.wait("p")
print("You pressed p")

Es wartet darauf, dass Sie p drücken und den Code so fortsetzen, wie er gedrückt wird.


Methode 3:

Verwendung der Funktion on_press_key:

import keyboard

keyboard.on_press_key("p", lambda _:print("You pressed p"))

Es benötigt eine Rückruffunktion. Ich benutzte _, weil die Tastaturfunktion das Tastaturereignis an diese Funktion zurückgibt.

Einmal ausgeführt, wird die Funktion ausgeführt, wenn die Taste gedrückt wird. Sie können alle Hooks stoppen, indem Sie diese Zeile ausführen:

keyboard.unhook_all()

Methode 4:

Diese Methode wird bereits von user8167727 beantwortet, aber ich bin mit dem von ihnen erstellten Code nicht einverstanden. Es wird die Funktion is_pressed aber auf andere Weise:

import keyboard

while True:
    if keyboard.is_pressed("p"):
        print("You pressed p")
        break

Die Schleife wird unterbrochen, wenn p gedrückt wird.


Anmerkungen:

  • keyboard liest Tastendrücke aus dem gesamten Betriebssystem.
  • keyboard erfordert root unter Linux
2
Black Thunder

Verwenden Sie diesen Code, um herauszufinden, welche Taste gedrückt wurde

from pynput import keyboard

def on_press(key):
    try:
        print('alphanumeric key {0} pressed'.format(
            key.char))
    except AttributeError:
        print('special key {0} pressed'.format(
            key))

def on_release(key):
    print('{0} released'.format(
        key))
    if key == keyboard.Key.esc:
        # Stop listener
        return False

# Collect events until released
with keyboard.Listener(
        on_press=on_press,
        on_release=on_release) as listener:
    listener.join()

Ich würde vorschlagen, dass Sie PyGame verwenden und ein Ereignis-Handle hinzufügen.

http://www.pygame.org/docs/ref/event.html

1
Madison Courto

Also habe ich diese Art von Spiel gemacht.

Folgendes ist die "Hauptfunktion" des Spiels, dh das Erkennen der gedrückten Tasten:

# Requiered libraries - - - -
import msvcrt
# - - - - - - - - - - - - - -


def _secret_key(self):
    # Get the key pressed by the user and check if he/she wins.

    bk = chr(10) + "-"*25 + chr(10)

    while True:

        print(bk + "Press any key(s)" + bk)
        #asks the user to type any key(s)

        kp = str(msvcrt.getch()).replace("b'", "").replace("'", "")
        # Store key's value.

        if r'\xe0' in kp:
            kp += str(msvcrt.getch()).replace("b'", "").replace("'", "")
            # Refactor the variable in case of multi press.

        if kp == r'\xe0\x8a':
            # If user pressed the secret key, the game ends.
            # \x8a is CTRL+F12, that's the secret key.

            print(bk + "CONGRATULATIONS YOU PRESSED THE SECRET KEYS!\a" + bk)
            print("Press any key to exit the game")
            msvcrt.getch()
            break
        else:
            print("    You pressed:'", kp + "', that's not the secret key(s)\n")
            if self.select_continue() == "n":
                if self.secondary_options():
                    self._main_menu()
                break

Wenn Sie den vollständigen Quellcode des Programms wünschen, können Sie es hier herunterladen oder herunterladen:

Das Secret Key Game (GitHub)

(Hinweis: Der geheime Tastendruck lautet: STRG + F12)

Ich hoffe, Sie können denjenigen, die diese Informationen konsultieren, als Beispiel und Hilfe dienen.

Schöne Grüße!

0
Ferd

schlüssel = cv2.waitKey (1)

Dies ist aus dem openCV-Paket . Es erkennt einen Tastendruck, ohne zu warten.

0
jms