web-dev-qa-db-fra.com

détecter une pression sur une touche en python?

Je crée un programme de type chronomètre en python et j'aimerais savoir comment détecter si une touche est enfoncée (telle que p pour pause et s pour arrêt), et je ne voudrais pas que ce soit quelque chose comme raw_input entrée de l'utilisateur avant de poursuivre l'exécution. Quelqu'un sait comment faire cela dans une boucle while?

Aussi, je voudrais faire cette multi-plateforme, mais si cela n'est pas possible, alors mon objectif de développement principal est Linux

32
lobuo

Python a un module keyboard avec de nombreuses fonctionnalités. Installez-le, peut-être avec cette commande: 

pip3 install keyboard

Puis utilisez-le dans un code comme:

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

Comme l'OP le mentionne à propos de raw_input - cela signifie qu'il veut une solution cli . Linux: curses est ce que vous voulez (windows PDCurses). Curses, est une API graphique pour le logiciel cli, vous pouvez faire plus que simplement détecter des événements clés.

Ce code détectera les touches jusqu’à ce que vous appuyiez sur la nouvelle ligne.

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

Pour Windows vous pouvez utiliser msvcrt comme ceci:

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

Pour ceux qui sont sur les fenêtres et qui ont du mal à trouver une solution de travail, voici la mienne: 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()

La fonction ci-dessus permet d’imprimer la touche sur laquelle vous appuyez et de lancer une action dès que vous relâchez la touche "échap". La documentation du clavier est ici pour un usage plus varié.

5
Mitrek

Utilisez PyGame pour avoir une fenêtre et ensuite vous pouvez obtenir les événements clés.

Pour la lettre 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

Utilisez ce code pour trouver la touche sur laquelle vous avez appuyé

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

Je vous suggérerais d'utiliser PyGame et d'ajouter un descripteur d'événement.

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

1
Madison Courto

Donc, j'ai créé ce type de jeu.

Voici la "fonction principale" du jeu, qui consiste à détecter les touches enfoncées:

# 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

Si vous voulez le code source complet du programme, vous pouvez le voir ou le télécharger ici:

Le jeu de clés secrètes (GitHub)

(note: la touche secrète est: CTRL + F12)

J'espère que vous pourrez servir d'exemple et aider ceux qui viendront consulter ces informations.

Salutations!

0
Ferd

clé = cv2.waitKey (1)

Cela provient du paquet openCV . Il détecte une frappe sans attendre.

0
jms