[python] 파이썬에서 키 누름을 감지합니까?

나는 파이썬에서 스톱워치 유형 프로그램을 만들고 있는데 키가 눌 렸는지 감지하는 방법을 알고 싶습니다 (예 : 일시 정지의 경우 p, 중지의 경우 s). 나는 그것을 기다리는 raw_input과 같은 것이되고 싶지 않습니다. 실행을 계속하기 전에 사용자의 입력. 누구나 while 루프에서 이것을 수행하는 방법을 알고 있습니까?

또한이 크로스 플랫폼을 만들고 싶지만 가능하지 않은 경우 주요 개발 대상은 Linux입니다.



답변

Python에는 많은 기능 이있는 키보드 모듈이 있습니다. 다음 명령을 사용하여 설치하십시오.

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
    except:
        break  # if user pressed a key other than the given key the loop will break


답변

창문에 있고 작동하는 답을 찾기 위해 고군분투하는 사람들을 위해 여기 내 것입니다 : 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’키를 놓을 때 작업을 시작합니다. 더 다양한 사용법을 위해 키보드 설명서가 여기 에 있습니다.

Markus von Broady 는 다음과 같은 잠재적 인 문제를 강조했습니다.이 답변은 현재 창에서이 스크립트를 활성화 할 필요가 없습니다. 창에 대한 해결책은 다음과 같습니다.

from win32gui import GetWindowText, GetForegroundWindow
current_window = (GetWindowText(GetForegroundWindow()))
desired_window_name = "Stopwatch" #Whatever the name of your window should be

#Infinite loops are dangerous.
while True: #Don't rely on this line of code too much and make sure to adapt this to your project.
    if current_window == desired_window_name:

        with Listener(
            on_press=on_press,
            on_release=on_release) as listener:
            listener.join()


답변

OP가 raw_input에 대해 언급했듯이-이는 그가 cli 솔루션을 원한다는 것을 의미합니다. Linux : curses 는 원하는 것입니다 (Windows PDCurses). Curses는 CLI 소프트웨어를위한 그래픽 API로, 주요 이벤트를 감지하는 것 이상을 달성 할 수 있습니다.

이 코드는 새 줄을 누를 때까지 키를 감지합니다.

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)


답변

keyboard모듈로 할 수있는 일이 더 있습니다 .

다음은 몇 가지 방법입니다.


방법 # 1 :

기능 사용 read_key():

import keyboard

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

p를 누르면 루프가 끊어 집니다.


방법 # 2 :

기능 사용 wait:

import keyboard

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

p눌렀을 때 코드 를 누르고 계속할 때까지 기다립니다 .


방법 # 3 :

기능 사용 on_press_key:

import keyboard

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

콜백 함수가 필요합니다. _키보드 기능이 해당 기능에 키보드 이벤트를 반환하기 때문에 사용했습니다 .

일단 실행되면 키를 누르면 기능이 실행됩니다. 다음 줄을 실행하여 모든 후크를 중지 할 수 있습니다.

keyboard.unhook_all()

방법 # 4 :

이 방법은 이미 user8167727 에 의해 답변 되었지만 그들이 만든 코드에 동의하지 않습니다. 함수를 사용 is_pressed하지만 다른 방식으로 사용합니다.

import keyboard

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

p누르면 루프가 끊어 집니다.


노트:

  • keyboard 전체 OS에서 키 누르기를 읽습니다.
  • keyboard 리눅스에서 루트 필요


답변

들어 윈도우 당신은 사용할 수 있습니다 msvcrt다음과 같이 :

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


답변

이 코드를 사용하여 누른 키를 찾으십시오.

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


답변

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: # replace the 'p' to whatever key you wanted to be pressed
             pass #Do what you want to here
        if event.type == pygame.locals.QUIT:
             pygame.quit()
             sys.exit()