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

2024-04-18 23:20:23 发布

您现在位置:Python中文网/ 问答频道 /正文

from Tkinter import *

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

我希望能够检查text_field当前是否被选中或聚焦,以便知道当用户按enter时是否对其内容执行操作。


Tags: text用户fromimportappfield内容tkinter
1条回答
网友
1楼 · 发布于 2024-04-18 23:20:23

如果您想在用户仅在焦点位于entry小部件时按enter时执行某些操作,只需向entry小部件添加一个绑定。它只有在小部件有焦点时才会启动。例如:

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)

注意,只有在按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)

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

这两种解决方案都很好,这取决于你真正需要发生的事情。如果您的主要目标是仅在用户在特定小部件中按return时执行某些操作,请使用前者。如果您想要一个全局绑定,但在该绑定中,根据具有或不具有焦点的内容执行不同的操作,请执行后一个示例。

相关问题 更多 >