ตัวอย่าง GUI:
สมมติว่าฉันมี GUI:
import tkinter as tk
root = tk.Tk()
btn = tk.Button(root, text="Press")
btn.pack()
root.mainloop()
เกิดอะไรขึ้นเมื่อกดปุ่ม
ดูว่าเมื่อbtn
กดแล้วจะเรียกใช้ฟังก์ชันของตัวเองซึ่งคล้ายกับbutton_press_handle
ในตัวอย่างต่อไปนี้:
def button_press_handle(callback=None):
if callback:
callback() # Where exactly the method assigned to btn['command'] is being callled
ด้วย:
button_press_handle(btn['command'])
คุณสามารถคิดว่าcommand
ตัวเลือกที่ควรจะตั้งเป็นอ้างอิงถึงวิธีการที่เราต้องการที่จะเรียกว่าคล้ายกับในcallback
button_press_handle
การเรียกใช้เมธอด ( โทรกลับ ) เมื่อกดปุ่ม
ไม่มีข้อโต้แย้ง
ดังนั้นหากฉันต้องการprint
บางสิ่งเมื่อกดปุ่มฉันจะต้องตั้งค่า:
btn['command'] = print # default to print is new line
ให้ความสนใจใกล้เคียงกับการขาดของ()
ด้วยprint
วิธีการที่ถูกละไว้ในความหมายที่ว่า: "นี่คือชื่อของวิธีการที่ฉันต้องการให้คุณโทรเมื่อกดแต่ . ไม่ได้เรียกว่าเพียงแค่นี้มากทันที" อย่างไรก็ตามฉันไม่ได้ผ่านการขัดแย้งใด ๆ สำหรับprint
มันจึงพิมพ์สิ่งที่มันพิมพ์เมื่อเรียกว่าไม่มีข้อโต้แย้ง
ด้วยอาร์กิวเมนต์
ตอนนี้ถ้าฉันต้องการส่งอาร์กิวเมนต์ไปยังวิธีที่ฉันต้องการให้เรียกเมื่อกดปุ่มฉันสามารถใช้ฟังก์ชันที่ไม่ระบุชื่อซึ่งสามารถสร้างด้วยคำสั่งlambdaในกรณีนี้สำหรับprint
วิธีการในตัวเช่นต่อไปนี้ :
btn['command'] = lambda arg1="Hello", arg2=" ", arg3="World!" : print(arg1 + arg2 + arg3)
การเรียกใช้หลายวิธีเมื่อกดปุ่ม
ไม่มีข้อโต้แย้ง
คุณยังสามารถใช้lambda
คำสั่งนั้นได้ แต่ก็ถือว่าเป็นการฝึกฝนที่ไม่ดีดังนั้นฉันจะไม่รวมที่นี่ แนวปฏิบัติที่ดีคือการกำหนดวิธีการแยกต่างหากmultiple_methods
ซึ่งเรียกวิธีการที่ต้องการแล้วตั้งค่าเป็นการเรียกกลับไปที่การกดปุ่ม:
def multiple_methods():
print("Vicariously") # the first inner callback
print("I") # another inner callback
ด้วยอาร์กิวเมนต์
ในการส่งผ่านอาร์กิวเมนต์ไปยังเมธอดที่เรียกใช้เมธอดอื่นให้ใช้lambda
คำสั่งอีกครั้ง แต่ก่อนอื่น:
def multiple_methods(*args, **kwargs):
print(args[0]) # the first inner callback
print(kwargs['opt1']) # another inner callback
จากนั้นตั้งค่า:
btn['command'] = lambda arg="live", kw="as the" : a_new_method(arg, opt1=kw)
การส่งคืนวัตถุจากการติดต่อกลับ
นอกจากนี้ยังทราบต่อไปว่าcallback
ไม่สามารถจริงๆreturn
เพราะมันเป็นเพียงการเรียกภายในbutton_press_handle
ด้วยเมื่อเทียบกับcallback()
return callback()
มันทำreturn
แต่ไม่ได้อยู่นอกฟังก์ชั่นนั้น ดังนั้นคุณควรแก้ไขวัตถุที่เข้าถึงได้ในขอบเขตปัจจุบัน
ทำตัวอย่างให้สมบูรณ์ด้วยการแก้ไขวัตถุระดับโลก
ตัวอย่างด้านล่างจะเรียกเมธอดที่เปลี่ยนbtn
ข้อความทุกครั้งที่กดปุ่ม:
import tkinter as tk
i = 0
def text_mod():
global i, btn # btn can be omitted but not sure if should be
txt = ("Vicariously", "I", "live", "as", "the", "whole", "world", "dies")
btn['text'] = txt[i] # the global object that is modified
i = (i + 1) % len(txt) # another global object that gets modified
root = tk.Tk()
btn = tk.Button(root, text="My Button")
btn['command'] = text_mod
btn.pack(fill='both', expand=True)
root.mainloop()
กระจกเงา