你如何检查一个小部件是不是在 Tkinter 中有焦点?

Posted

技术标签:

【中文标题】你如何检查一个小部件是不是在 Tkinter 中有焦点?【英文标题】:How do you check if a widget has focus in Tkinter?你如何检查一个小部件是否在 Tkinter 中有焦点? 【发布时间】:2010-11-26 00:50:05 【问题描述】:
from Tkinter import *

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

我希望能够检查text_field 当前是否被选中或聚焦,以便我知道当用户按下回车时是否对其内容进行处理。

【问题讨论】:

【参考方案1】:

如果您只想在用户按下回车键时仅在焦点位于条目小部件上时执行某些操作,只需将绑定添加到条目小部件即可。仅当该小部件具有焦点时才会触发。例如:

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

注意两者之间的区别:在第一个示例中,仅当您在第一个条目小部件中按回车时才会调用处理程序。无需检查哪个小部件具有焦点。在第二个示例中,无论哪个小部件具有焦点,都会调用处理程序。

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

【讨论】:

这件事是否可能,但无需等待按下回车键。例如,当用户只是选择 Entry 输入内容时,是否有可能知道那件事发生了? @MuhamedHuseinbašić:是的,有可能。 怎么做? :D 我在哪里可以找到那个? @MuhamedHuseinbašić:您在&lt;FocusIn&gt; 上设置了绑定。 This page 解释了每种可能的绑定的作用。

以上是关于你如何检查一个小部件是不是在 Tkinter 中有焦点?的主要内容,如果未能解决你的问题,请参考以下文章

Tkinter 检查输入框是不是为空

tkinter Checkbutton 小部件返回错误的布尔值

Python Tkinter Checkbutton 与其他小部件对齐

如何为 Tkinter 条目小部件设置默认文本

如何从锚点旋转 tkinter 画布小部件?

如何使用 tkinter 中的按钮设置“Entry”小部件的文本/值/内容