it-swarm.com.ru

обнаружить нажатие клавиши в Python?

Я делаю программу типа секундомера на Python, и я хотел бы знать, как определить, нажата ли клавиша (например, p для паузы и s для остановки), и я не хотел бы, чтобы это было что-то вроде raw_input, который ждет ввод пользователя перед продолжением исполнения. Кто-нибудь знает, как сделать это во время цикла?

Кроме того, я хотел бы сделать это кроссплатформенным, но если это невозможно, то моя главная цель разработки - Linux

32
lobuo

В Python есть модуль keyboard со многими функциями. Установите его, возможно, с помощью этой команды: 

pip3 install keyboard

Тогда используйте это в коде как:

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

В качестве OP упоминается о raw_input - это означает, что он хочет получить решение для Кли ........ Linux: curses это то, что вы хотите (windows PDCurses). Curses, это графический API для Cli Software, вы можете достичь большего, чем просто обнаруживать ключевые события.

Этот код будет обнаруживать клавиши до тех пор, пока не будет нажата новая строка.

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

Для Windows вы можете использовать msvcrt следующим образом:

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

Для тех, кто на окнах и пытался найти рабочий ответ, вот мой: 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()

Приведенная выше функция будет печатать любую нажатую клавишу, а также запускать действие при отпускании клавиши «esc». Документация для клавиатуры находится здесь для более разнообразного использования.

5
Mitrek

Используйте PyGame, чтобы иметь окно, а затем вы можете получить ключевые события.

Для письма 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

Используйте этот код, чтобы найти, какая клавиша нажата

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
Manivannan Murugavel

Я бы предложил вам использовать PyGame и добавить дескриптор события.

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

1
Madison Courto

Так что я сделал это .. вид игры .. на основе этого поста (используя библиотеку msvcr и Python 3.7).

Ниже приводится «основная функция» игры, которая заключается в обнаружении нажатых клавиш:

# 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

Если вам нужен полный исходный код программы, вы можете посмотреть его или скачать здесь:

Секретный ключ игры (GitHub)

(примечание: секретное нажатие клавиши: CTRL + F12)

Я надеюсь, что вы можете служить примером и помощью для тех, кто приходит, чтобы ознакомиться с этой информацией.

Привет!

0
Ferd

key = cv2.waitKey (1)

Это из пакета openCV . Он обнаруживает нажатие клавиши без ожидания.

0
jms