获取 Tkinter 中触发事件的小部件的 ID


Tkinter 提供了一种将事件绑定到小部件的机制。当发生事件(例如按钮点击或鼠标移动)时,会执行与该事件关联的特定函数或方法。事件处理程序函数通常将事件对象作为参数,该对象提供有关事件的信息。虽然事件对象不直接包含小部件的 ID,但我们可以使用各种技术根据事件识别小部件。在本文中,让我们探讨这些方法。

方法 1

让我们首先检查一个简单的示例,该示例演示如何检索触发事件的小部件的 ID -

示例

import tkinter as tk

def on_button_click(event):
   widget_id = event.widget.winfo_id()
   print(f"The ID of the widget is: {widget_id}")

root = tk.Tk()
root.geometry("720x250")
root.title("Retrieving the ID of a widget that invokes an event")

button = tk.Button(root, text="Click Me")
button.bind("<Button-1>", on_button_click)
button.pack()

root.mainloop()

在上面的代码中,我们导入 tkinter 模块并创建一个具有根窗口的基本 Tkinter 应用程序。我们定义了一个 on_button_click 函数来处理按钮点击事件。事件对象作为参数传递给此函数。

在事件处理程序函数内部,我们通过访问事件对象的 widget 属性来检索小部件 ID。我们对小部件使用 winfo_id() 方法来获取其 ID。最后,我们使用 f-string 打印小部件 ID。

接下来,我们创建一个名为 button 的 Button 小部件,并将左鼠标按钮点击事件 ("<Button-1>") 绑定到 on_button_click 函数。这意味着每当单击按钮时,都会调用事件处理程序函数。

输出

运行代码时,您将看到一个带有按钮的 Tkinter 窗口。单击按钮时,触发事件的小部件 (button) 的 ID 将打印到控制台。

The ID of the widget is: 1771520

方法 2

另一种方法是为每个小部件分配一个唯一的标识符,并在发生事件时使用它来识别小部件。Tkinter 提供了 tkinter.Variable 类,可用于存储与小部件关联的数据。我们可以为每个小部件创建一个变量并为其设置一个唯一的值。稍后,我们可以访问变量值来检索小部件 ID。

示例

以下是一个演示此方法的示例 -

import tkinter as tk

def on_button_click():
   button_id = button_var.get()
   print(f"The ID of the button is: {button_id}")

root = tk.Tk()
root.geometry("720x250")
root.title("Retrieving the ID of a widget by assigning a unique identifier to each widget")

button_var = tk.StringVar(value="Button-1")
button = tk.Button(root, command=on_button_click)
button.config(textvariable=button_var)
button.pack()

root.mainloop()

在此代码中,我们定义了一个 on_button_click 函数来处理按钮点击事件。在函数内部,我们通过访问 button_var 变量的值来检索按钮 ID。

我们创建一个名为 button_var 的 StringVar 对象并为其分配一个唯一的值。此值表示按钮的 ID。稍后,我们将按钮小部件配置为使用此变量作为其 textvariable。这意味着按钮的显示文本将是存储在 button_var 中的值。

输出

单击按钮时,会调用 on_button_click 函数,并从 button_var 中检索按钮 ID。最后,将小部件 ID 打印到控制台。

The ID of the button is: Button-1

方法 3

获取触发事件的小部件 ID 的另一种方法是使用 lambda 函数或偏函数。这些技术允许我们将其他参数(例如小部件 ID)传递给事件处理程序函数。

示例

以下是一个说明 lambda 函数用法的示例 -

import tkinter as tk

def on_button_click(widget_id):
   print(f"The ID of the widget is: {widget_id}")

root = tk.Tk()
root.geometry("720x250")
root.title("Retrieving the ID of a widget by using lambda functions")

button1 = tk.Button(root, text="Button 1", command=lambda: on_button_click("Button-1"))
button1.pack()

button2 = tk.Button(root, text="Button 2", command=lambda: on_button_click("Button-2"))
button2.pack()
root.mainloop()

在此代码中,我们定义了一个 on_button_click 函数来处理按钮点击事件。它接受一个参数 widget_id,表示小部件的 ID。

我们创建了两个按钮小部件 (button1 和 button2)。在为每个按钮定义命令时,我们使用 lambda 函数来调用 on_button_click 函数,并将相应的小部件 ID 作为参数。

输出

运行代码时,单击每个按钮都会调用 on_button_click 函数,并将相应的小部件 ID 传递给它。然后将小部件 ID 打印到控制台。

The ID of the widget is: Button-1
The ID of the widget is: Button-2

结论

可以使用不同的技术来检索 Tkinter 中触发事件的小部件的 ID。通过访问 winfo_id() 方法、使用变量存储小部件 ID 或使用带有其他参数的 lambda 函数,您可以获取必要的信息来识别触发事件的小部件。这些方法提供了处理事件的灵活性,并使您能够根据小部件 ID 实现特定的操作或条件逻辑。尝试使用这些技术,并选择最适合您的应用程序需求的技术。

更新于: 2023年12月4日

1K+ 浏览量

启动您的 职业生涯

通过完成课程获得认证

开始
广告