Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

การส่งอาร์กิวเมนต์ให้ Event Handler ใน Tkinter

เมื่อต้องการส่งอาร์กิวเมนต์เพิ่มเติมให้ Event Handler ใน Tkinter ใช้ Lambda Function ห่อหุ้ม Callback Function

ตัวอย่างโค้ด


from tkinter import *
from tkinter import ttk
from tkinter import filedialog

win = Tk()
win.geometry("750x250")

def event_low(button1):
    label.config(text="This is Lower Value")

def event_mid(button2):
    label.config(text="This is Medium Value")

def event_high(button3):
    label.config(text="This is Highest value")

label = Label(win, text="", font=('Helvetica 15 underline'))
label.pack()

frame = Frame(win)

# ใช้ Lambda ส่ง Widget Object ไปให้ Handler
button1 = ttk.Button(frame, text="Low", command=lambda: event_low(button1))
button1.pack(pady=10)

button2 = ttk.Button(frame, text="Medium", command=lambda: event_mid(button2))
button2.pack(pady=10)

button3 = ttk.Button(frame, text="High", command=lambda: event_high(button3))
button3.pack(pady=10)

frame.pack()
win.mainloop()

รูปแบบ Lambda สำหรับส่ง Arguments

รูปแบบตัวอย่างใช้เมื่อ
ไม่มี Argumentcommand=callbackCallback ไม่ต้องการ Argument
Argument คงที่command=lambda: callback("fixed")ส่งค่าคงที่
Argument จาก Variablecommand=lambda x=var: callback(x)Capture ค่าตอนสร้าง (แก้ Late Binding)
Event + Argumentbind('', lambda e, x=val: cb(e, x))Event Binding พร้อม Extra Arg

ปัญหา Late Binding ใน Loop (ซ้ำ)


# ❌ ผิด
for i in range(3):
    btn = Button(win, text=i, command=lambda: print(i))  # ทุกตัวพิมพ์ 2

# ✅ ถูก - Default Argument
for i in range(3):
    btn = Button(win, text=i, command=lambda i=i: print(i))

# ✅ ถูก - functools.partial
from functools import partial
for i in range(3):
    btn = Button(win, text=i, command=partial(print, i))

การส่ง Argument ใน bind()


# ส่ง Event และ Argument เพิ่มเติม
entry.bind('', lambda e, val=entry.get(): process(val))

# หรือใช้ Factory Function
def make_handler(value):
    def handler(event):
        process(value)
    return handler

entry.bind('', make_handler("fixed_value"))

การประยุกต์ใช้

หลายปุ่มใช้ Handler เดียวกันแตกต่างแค่พารามิเตอร์: Calculator Keypad, Menu Items, Tab Switchers, Color Pickers, Tool Selectors