8

ループを実行しているプログラムがあります。たとえば、キーボードの「ESC」キーを押すたびに、「ESCキーを押しました」と出力する関数が呼び出され、いくつかのコマンドも実行される可能性があります。

私はこれを試しました:

from msvcrt import getch

while True:
    key = ord(getch())
    if key == 27: #ESC
        print("You pressed ESC")
    elif key == 13: #Enter
        print("You pressed key ENTER")
        functionThatTerminatesTheLoop()

すべての試行の後、msvcrt は python 3.3 またはその他の理由で動作しないようです。基本的に、プログラムの実行中に任意の時点でキーが押されたときにプログラムを反応させるにはどうすればよいですか?

編集:また、私はこれを見つけました:

import sys

while True:
    char = sys.stdin.read(1)
    print ("You pressed: "+char)
    char = sys.stdin.read(1)

ただし、入力を再開するには、コマンド コンソールに入力する必要がありますが、ループを tkinter で実行しているため、キープレスが検出された直後に何かを実行する方法が必要です。

4

2 に答える 2

2

プログラムはtkinterモジュールを使用するため、バインドは非常に簡単です。のような外部モジュールは必要ありませんPyHook

例えば:

from tkinter import * #imports everything from the tkinter library

def confirm(event=None): #set event to None to take the key argument from .bind
    print('Function successfully called!') #this will output in the shell

master = Tk() #creates our window

option1 = Button(master, text = 'Press Return', command = confirm)
option1.pack() #the past 2 lines define our button and make it visible

master.bind('<Return>', confirm) #binds 'return' to the confirm function

残念ながら、これはウィンドウでのみ機能しTk()ます。また、キー バインド中にコールバックを適用する場合、引数を指定することはできません。

のさらに詳しい説明として、引数としてキーを送信するのが煩わしいevent=Noneので入れます。これは、関数にパラメーターとしてmaster.bind配置することで修正されます。event次に、同じコールバックを使用するボタンがあるためevent、デフォルト値に設定します。Noneそれがない場合はTypeError.

于 2013-10-31T14:46:38.783 に答える