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

20
from Tkinter import *

app = Tk()
text_field = Entry(app)
text_field.pack()
app.mainloop()
我希望能够检查text_field 当前是否被选中或聚焦,这样我就能知道当用户按下 Enter 键时是否需要对它的内容进行操作。
1个回答

30

如果您希望在用户输入框具有焦点时仅在用户按下回车键时执行某些操作,只需为该输入框添加绑定即可。当且仅当该小部件具有焦点时,它才会被触发。例如:

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

请注意,仅当第一个条目具有焦点时,按回车键时才会调用处理程序。

如果您确实需要全局绑定并且需要知道哪个小部件具有焦点,请在根对象上使用 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()

注意这两个示例之间的区别:在第一个示例中,只有当您在第一个输入小部件中按下回车键时才会调用处理程序。不需要检查哪个小部件具有焦点。在第二个示例中,无论哪个小部件具有焦点,都将调用处理程序。

根据您需要实际发生的情况,这两种解决方案都很好。如果您的主要目标是仅在用户在特定小部件中按下回车键时执行某些操作,请使用前者。如果您希望进行全局绑定,但在该绑定中根据具有或不具有焦点的内容执行不同的操作,请使用后者示例。


1
这个东西可能吗,但是不需要等待按下回车键。例如,当用户只是选择输入以输入某些内容时,是否可以知道发生了那件事情? - Muhamed Huseinbašić
1
@MuhamedHuseinbašić:是的,这是可能的。 - Bryan Oakley
怎么做? :D 我可以在哪里找到? - Muhamed Huseinbašić
2
@MuhamedHuseinbašić:你在“<FocusIn>”上设置了一个绑定。 - Bryan Oakley
这个页面详细解释了每种可能的绑定是做什么的。 - Nicolas Abril

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接