파이썬에서 키 누름을 감지합니까?
파이썬에서 스톱워치 유형 프로그램을 만들고 있는데 키가 눌 렸는지 감지하는 방법을 알고 싶습니다 (예 : 일시 정지의 경우 p, 중지의 경우 s). 실행을 계속하기 전에 사용자의 입력. 누구나 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
else:
pass
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
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)
들어 윈도우 당신은 사용할 수 있습니다 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()
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
리눅스에서 루트 필요
PyGame을 사용하고 이벤트 핸들을 추가하는 것이 좋습니다.
http://www.pygame.org/docs/ref/event.html
그래서 저는이 게시물을 기반으로 .. 종류의 게임을 만들었습니다 (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
porgram의 전체 소스 코드를 원하면 여기에서 보거나 다운로드 할 수 있습니다.
(참고 : 비밀 키 누르기 : Ctrl+ F12)
이 정보를 참조하러 오는 사람들에게 모범이되고 도움이되기를 바랍니다.
key = cv2.waitKey(1)
이것은 openCV 패키지에서 가져온 것입니다. 기다리지 않고 키 누름을 감지합니다.
참조 URL : https://stackoverflow.com/questions/24072790/detect-key-press-in-python
'IT이야기' 카테고리의 다른 글
원래 행 순서를 유지하면서 두 데이터 프레임 병합 (0) | 2021.03.22 |
---|---|
Java 8 람다 재귀 함수 (0) | 2021.03.21 |
commonjs / amd 모듈을 가져 오기위한 새로운 es6 구문, 즉 import foo = require ( 'foo') (0) | 2021.03.21 |
Spark를 사용하여 중앙값과 분위수를 찾는 방법 (0) | 2021.03.21 |
Chrome에 이미 '$'가 정의되어 있는 것일까 (0) | 2021.03.21 |