如何检查小部件是否在Tkinter中具有焦点?

cst*_*ack 12 python focus tkinter tkinter-entry

from Tkinter import *

app = Tk()
text_field = Entry(app)
text_field.pack()
app.mainloop()
Run Code Online (Sandbox Code Playgroud)

我希望能够检查text_field当前是选择还是关注,以便在用户按Enter键时我知道是否对其内容执行某些操作.

Bry*_*ley 20

如果您想在用户仅在焦点位于条目小部件时按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)
Run Code Online (Sandbox Code Playgroud)

请注意,只有在按下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)
Run Code Online (Sandbox Code Playgroud)

注意两者之间的区别:在第一个示例中,只有在第一个条目小部件中按下return时才会调用处理程序.无需检查哪个小部件具有焦点.在第二个示例中,无论哪个窗口小部件具有焦点,都将调用处理程序.

两种解决方案都很好,取决于您真正需要发生的事情.如果您的主要目标是仅在用户按下特定小部件中的返回时执行某些操作,请使用前者.如果你想要一个全局绑定,但是在那个绑定中根据有或没有焦点的东西做一些不同的事情,做后一个例子.

  • @MuhamedHuseinbašić:您对`&lt;FocusIn&gt;`设置了绑定。 (2认同)