ตัวอย่าง 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ตัวเลือกที่ควรจะตั้งเป็นอ้างอิงถึงวิธีการที่เราต้องการที่จะเรียกว่าคล้ายกับในcallbackbutton_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()
กระจกเงา