シンプルな電卓に Entry ウィジェットがあります。ユーザーは、キーパッドを介して方程式を入力することを選択できます。Entry ウィジェットに入力されている文字 (私の場合はキーパッドから) を検出する方法があるかどうか疑問に思っていました。したがって、フォーカスはウィジェットにあり、ユーザーが「4」を押すと、ウィジェットに表示されます...入力をログに記録するという基本的な目的で、この行為を検出できますか?
3 に答える
Tkinter ウィンドウ内でキーを押すたびに、Tkinter.Event
インスタンスが作成されます。そのインスタンスにアクセスするだけです。以下は、その方法を示す簡単なスクリプトです。
from Tkinter import Tk, Entry
root = Tk()
def click(key):
# print the key that was pressed
print key.char
entry = Entry()
entry.grid()
# Bind entry to any keypress
entry.bind("<Key>", click)
root.mainloop()
key
(Tkinter.Event
インスタンスである)には、押されたキーで必要なほぼすべてのタイプのデータを取得するために使用できるさまざまな属性が含まれています。.char
ここでは属性を使用することにしました。これにより、スクリプトは各キー押下を出力します。
はい。実際、これを行うにはいくつかの異なる方法があります。
を作成してStringVar
に添付し、Entry
変更することができますtrace
。bind
関連するすべてのイベントを表示できます。または、シーケンス内のいくつかの異なるポイントのいずれかで起動する検証コマンドを追加できます。それらはすべて、わずかに異なることを行います。
ユーザーがを入力すると、その中に4
だけのキー イベントがあります(これでは、ユーザーが最後に追加したのか、途中で追加したのか、選択した単語全体を置き換えたのか、または…4
を区別できません)。4
変更イベントは古いテキストで起動されます*。次に、「キー」または「すべて」の検証関数が (提案された) 新しいテキストで呼び出され、変数が (受け入れられた) 新しいテキストで更新されます (検証関数が返されない場合) false の場合、invalidcommand
代わりに が呼び出されます)。
どれが欲しいかわからないので、全部見せてあげましょう。いろいろ試して、好きなものを選んでください。
import Tkinter as tk
root = tk.Tk()
def validate(newtext):
print('validate: {}'.format(newtext))
return True
vcmd = root.register(validate)
def key(event):
print('key: {}'.format(event.char))
def var(*args):
print('var: {} (args {})'.format(svar.get(), args))
svar = tk.StringVar()
svar.trace('w', var)
entry = tk.Entry(root,
textvariable=svar,
validate="key", validatecommand=(vcmd, '%P'))
entry.bind('<Key>', key)
entry.pack()
root.mainloop()
可変トレース コールバックの構文は少し複雑で、Tkinter では十分に文書化されていません。最初の 2 つの引数の意味を知りたい場合は、Tcl/Tk のドキュメントを読み、Tkinter が特定の引数をStringVar
Tcl 名にどのようにマッピングするかを理解する必要があります'PY_VAR0'
。トレースするモードを選択し、引数を無視します。
検証関数の構文はさらに複雑で、これまでに示したよりもはるかに柔軟です。たとえば、挿入されたテキスト (貼り付け操作の場合は複数の文字になる可能性があります)、その位置、およびその他のあらゆる種類のものを取得できますが、これは Tkinter ドキュメントのどこにも記述されていないため、Tcl/Tk docsに行く必要があります。最も一般的なのは、提案された新しいテキストを引数として使用することです。そのためには、 を使用します(vcmd, '%P')
。
とにかく、さまざまなことをして遊んで、各メカニズムが何をもたらすかを確認する必要があります。入力する前にカーソルを移動するか、文字列の一部を選択し、キーボードとマウスを使用して貼り付け、選択範囲をドラッグ アンド ドロップし、さまざまな特殊キーを押します。
* この手順は Tk のバージョンごとに異なり、あまり役に立たないため、無視します。変更されたイベントが本当に必要な場合は、Text
ウィジェットと bindを使用することをお勧めします<<Modified>>
。