เมื่อต้องการส่งอาร์กิวเมนต์เพิ่มเติมให้ 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
| รูปแบบ | ตัวอย่าง | ใช้เมื่อ |
|---|---|---|
| ไม่มี Argument | command=callback | Callback ไม่ต้องการ Argument |
| Argument คงที่ | command=lambda: callback("fixed") | ส่งค่าคงที่ |
| Argument จาก Variable | command=lambda x=var: callback(x) | Capture ค่าตอนสร้าง (แก้ Late Binding) |
| Event + Argument | bind(' | 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