나는 파이썬에서 스톱워치 유형 프로그램을 만들고 있는데 키가 눌 렸는지 감지하는 방법을 알고 싶습니다 (예 : 일시 정지의 경우 p, 중지의 경우 s). 나는 그것을 기다리는 raw_input과 같은 것이되고 싶지 않습니다. 실행을 계속하기 전에 사용자의 입력. 누구나 while 루프에서 이것을 수행하는 방법을 알고 있습니까?
또한이 크로스 플랫폼을 만들고 싶지만 가능하지 않은 경우 주요 개발 대상은 Linux입니다.
나는 파이썬에서 스톱워치 유형 프로그램을 만들고 있는데 키가 눌 렸는지 감지하는 방법을 알고 싶습니다 (예 : 일시 정지의 경우 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
keyboard
분명히 리눅스에서 루트가 필요합니다 : /
창문에 있고 작동하는 답을 찾기 위해 고군분투하는 사람들을 위해 여기 내 것입니다 : 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)
termios
...
import os
예제를 종료하려면 추가해야합니다 .
win.nodelay(False)
대신 수행하면 True
초당 백만 개의 예외가 생성되지 않습니다.
keyboard
모듈로 할 수있는 일이 더 있습니다 .
다음은 몇 가지 방법입니다.
기능 사용 read_key()
:
import keyboard
while True:
if keyboard.read_key() == "p":
print("You pressed p")
break
키 p를 누르면 루프가 끊어 집니다.
기능 사용 wait
:
import keyboard
keyboard.wait("p")
print("You pressed p")
p눌렀을 때 코드 를 누르고 계속할 때까지 기다립니다 .
기능 사용 on_press_key
:
import keyboard
keyboard.on_press_key("p", lambda _:print("You pressed p"))
콜백 함수가 필요합니다. _
키보드 기능이 해당 기능에 키보드 이벤트를 반환하기 때문에 사용했습니다 .
일단 실행되면 키를 누르면 기능이 실행됩니다. 다음 줄을 실행하여 모든 후크를 중지 할 수 있습니다.
keyboard.unhook_all()
이 방법은 이미 user8167727 에 의해 답변 되었지만 그들이 만든 코드에 동의하지 않습니다. 함수를 사용 is_pressed
하지만 다른 방식으로 사용합니다.
import keyboard
while True:
if keyboard.is_pressed("p"):
print("You pressed p")
break
p누르면 루프가 끊어 집니다.
노트:
keyboard
전체 OS에서 키 누르기를 읽습니다.keyboard
리눅스에서 루트 필요keyboard.wait()
두 개 이상의 키를 기다리는 데 사용할 수 있는지 알고 싶었고 둘 중 하나를 눌렀을 때 계속할 수 있는지 알고 싶었습니다.
wait()
는이 기능을 제공하지 않습니다. keyboard.read_key()
while 루프에 포함 된 if 조건과 함께 사용해야 합니다. 방법 # 1
suppress
의 키워드 사용 keyboard.read_key()
을 사용하지 않을 때 .... 때,
들어 윈도우 당신은 사용할 수 있습니다 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()
그래서 저는이 게시물을 기반으로 .. 종류의 게임을 만들었습니다 (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)
이 정보를 참조하러 오는 사람들에게 모범이되고 도움이되기를 바랍니다.
PyGame을 사용하고 이벤트 핸들을 추가하는 것이 좋습니다.