獲取 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+ 瀏覽量

啟動您的 職業生涯

透過完成課程獲得認證

開始
廣告

© . All rights reserved.