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
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
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)
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
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é.
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()
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()
Je vous suggérerais d'utiliser PyGame et d'ajouter un descripteur d'événement.
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!
clé = cv2.waitKey (1)
Cela provient du paquet openCV . Il détecte une frappe sans attendre.