web-dev-qa-db-ja.com

Pythonでキー押下を検出しますか?

pythonでストップウォッチタイプのプログラムを作成しています。キーが押されたかどうかを検出する方法を知りたい(一時停止の場合はp、停止の場合はsなど)。 raw_inputなど、ユーザーの入力を待ってから実行を継続します。誰でもwhileループでこれを行う方法を知っていますか?

また、このクロスプラットフォームを作成したいのですが、それが不可能な場合、私の主な開発ターゲットはLinuxです

49
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
35
user8167727

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)
17
Abc Xyz

窓の上にいて、有効な答えを見つけるのに苦労していた人のために、ここに私のものがあります: 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」キーを放すと、押しているキーを印刷し、アクションを開始します。キーボードのドキュメントは、より多様な使用法のための here です。

16
Mitrek

Windowsの場合、次のようにmsvcrtを使用できます。

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

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

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にはLinuxのルートが必要です
2
Black Thunder

そこで、この投稿に基づいてこれを作成しました(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の完全なソースコードが必要な場合は、ここから参照またはダウンロードできます。

秘密鍵ゲーム(GitHub)

(注:シークレットキープレスは: Ctrl+F12

この情報を参考にするために来てくれた人たちのために、あなたが例として役立つことを願っています。

1
Ferd

PyGameを使用してイベントハンドルを追加することをお勧めします。

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

1
Madison Courto
key = cv2.waitKey(1)

これはopenCVパッケージからのものです。待機せずにキー押下を検出します。

0
user1261273