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

การใช้ Lambda Function กับคำสั่งปุ่ม (Button Command) ใน Tkinter Python

ฟังก์ชัน 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 ที่มีปุ่มหลายปุ่มทำงานคล้ายกันแตกต่างแค่พารามิเตอร์ เช่น เครื่องคิดเลข เมนูอาหาร ตัวเลือกสี ปุ่มนำทางหน้า