ฟังก์ชัน Lambda (Anonymous Function) ใน Python มีประโยชน์มากในการสร้าง GUI ด้วย Tkinter โดยเฉพาะการส่งผ่านพารามิเตอร์หลายค่าให้ฟังก์ชัน Callback ของปุ่ม (Button Command)
คำอธิบายหลักการ
- Lambda ช่วยให้สร้างฟังก์ชันไม่มีชื่อ (anonymous) สำหรับนิพจน์เดี่ยว
- ใน
Button(command=...)ต้องการ callable object - ถ้าใช้
command=func(arg)จะเรียกทันที (ไม่ใช่ callback) - ใช้
command=lambda: func(arg)เพื่อสร้าง callback ที่ส่ง arg ไปให้ func
ตัวอย่างโค้ด
# Import the library
from tkinter import *
from tkinter import ttk
# Create an instance of Tkinter frame
win = Tk()
win.geometry("750x250")
# Callback function
def print_text(text):
Label(win, text=text, font=('Helvetica 13 bold')).pack()
# ปุ่มพร้อม lambda ส่งข้อความต่างกัน
btn1 = ttk.Button(win, text="Button1", command=lambda: print_text("Button 1"))
btn1.pack(pady=10)
btn2 = ttk.Button(win, text="Button2", command=lambda: print_text("Button 2"))
btn2.pack(pady=10)
btn3 = ttk.Button(win, text="Button3", command=lambda: print_text("Button 3"))
btn3.pack(pady=10)
win.mainloop()
การทำงานของ Lambda ในที่นี้
- แต่ละปุ่มมี lambda function ตัวของตัวเอง
- เมื่อคลิกปุ่ม Lambda จะถูกเรียก → เรียก
print_text()พร้อม argument ที่ผูกมาจากตอนสร้าง - ทำให้ใช้ฟังก์ชัน callback เดียวกันได้ หลายปุ่ม ส่งค่าต่างกัน
ข้อผิดพลาดที่พบบ่อย: Late Binding ใน Loop
# ❌ ผิด - ทุกปุ่มจะพิมพ์ค่า i สุดท้าย
for i in range(3):
btn = ttk.Button(win, text=f"Button {i}", command=lambda: print(i))
btn.pack()
# ✅ ถูก - ใช้ default argument capture ค่า i ณ เวลาสร้าง
for i in range(3):
btn = ttk.Button(win, text=f"Button {i}", command=lambda i=i: print(i))
btn.pack()
# ✅ หรือใช้ functools.partial
from functools import partial
for i in range(3):
btn = ttk.Button(win, text=f"Button {i}", command=partial(print, i))
btn.pack()
กรณีใช้ Lambda กับ Event Binding
# ผูก Enter key ให้เรียก callback พร้อม argument
entry.bind('', lambda event: callback(entry.get()))
# หรือส่ง event object ไปด้วย
btn.bind('', lambda e: handle_click(e, extra_arg))
การประยุกต์ใช้
จำเป็นสำหรับ GUI ที่มีปุ่มหลายปุ่มทำงานคล้ายกันแตกต่างแค่พารามิเตอร์ เช่น เครื่องคิดเลข เมนูอาหาร ตัวเลือกสี ปุ่มนำทางหน้า