2013-10-31 20 views
6

ループを実行しているプログラムがあります。 たとえば、キーボードのキー「ESC」を押すたびに、「あなたはESCキーを押しました」と表示し、コマンドを実行する機能を呼び出す必要があります。Pythonでキーが押されたときに関数を呼び出す方法

私はこの試みた:すべての私の試み、MSVCRT doesntのは、Python 3.3でまたは他の何らかの理由のために働くように見える後

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

を。 基本的には、プログラムの実行中に、いつどのキーポイントでもプログラムを反応させることができますか?

EDIT:まだ

import sys 

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

しかし、それはreisteredする入力用のコマンドコンソールに入力する入力が必要ですが、私はTkinterでは、私のループを実行しているので、私:また、私はこれを見つけましたkeypressが検出された直後に何かをする方法が必要です。

+1

私はあなたがIDLE(またはおそらく別のIDE)では動作しないと思っています。しかし、基本的な考え方(例えば、 'elif'までの部分)は、少なくとも私のためには完全に機能します。 – rlms

答えて

1

プログラムで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になるからです。

+0

こんにちは、ありがとう、これは私が正確に探していたものではありませんでしたが、それは私の間違いを見つけるのを助けました。私は.tag_bind()を使用していましたが、それらは指向のオブジェクトでしか動作しませんでした.bindを使って試しました。それは完全に動作します:)いつでも任意のキー押しでコマンドを与えることができ、何もフォーカスする必要はありません。D – user2919805

+0

Happy助けて!いいえ、どいたしまして。 –

関連する問題