14
from Tkinter import *

app = Tk()
text_field = Entry(app)
text_field.pack()
app.mainloop()

が現在選択されているか、フォーカスされているかを確認できるようにしtext_fieldて、ユーザーが Enter キーを押したときにその内容で何かを行うかどうかを確認できるようにしたいと考えています。

4

1 に答える 1

25

エントリ ウィジェットにフォーカスがある場合にのみユーザーが Enter キーを押したときに何かを実行したい場合は、エントリ ウィジェットにバインドを追加するだけです。そのウィジェットにフォーカスがある場合にのみ起動します。例えば:

import tkinter as tk

root = tk.Tk()
e1 = tk.Entry(root)
e2 = tk.Entry(root)
e1.pack()
e2.pack()

def handleReturn(event):
    print("return: event.widget is",event.widget)
    print("focus is:", root.focus_get())

e1.bind("<Return>", handleReturn)

root.mainloop()

Return キーを押したときに最初のエントリにフォーカスがある場合にのみ、ハンドラーが呼び出されることに注意してください。

本当にグローバル バインディングが必要で、どのウィジェットにフォーカスがあるかを知る必要がある場合は、ルート オブジェクトで focus_get() メソッドを使用します。次の例では、"." にバインドが適用されます。(メインのトップレベル)何がフォーカスされていても起動するように:

import tkinter as tk

root = tk.Tk()
e1 = tk.Entry(root)
e2 = tk.Entry(root)
e1.pack()
e2.pack()

def handleReturn(event):
    print("return: event.widget is",event.widget)
    print("focus is:",root.focus_get())

root.bind("<Return>", handleReturn)

root.mainloop()

2 つの違いに注意してください。最初の例では、最初のエントリ ウィジェットで return キーを押したときにのみハンドラーが呼び出されます。どのウィジェットにフォーカスがあるかを確認する必要はありません。2 番目の例では、どのウィジェットにフォーカスがあるかに関係なく、ハンドラーが呼び出されます。

どちらの解決策も、実際に何が起こる必要があるかに応じて適切です。ユーザーが特定のウィジェットで return キーを押したときにのみ何かを行うことが主な目的である場合は、前者を使用します。グローバルバインディングが必要であるが、そのバインディングで、フォーカスがあるものとないものに基づいて何か異なることを行う場合は、後者の例を実行してください。

于 2009-09-06T15:32:23.830 に答える