Örnek GUI:
Diyelim ki GUI'm var:
import tkinter as tk
root = tk.Tk()
btn = tk.Button(root, text="Press")
btn.pack()
root.mainloop()
Bir Düğmeye Basıldığında Ne Olur
btn
Basıldığında , aşağıdaki örnekte çok benzer olan kendi işlevini çağırdığını görün button_press_handle
:
def button_press_handle(callback=None):
if callback:
callback() # Where exactly the method assigned to btn['command'] is being callled
ile:
button_press_handle(btn['command'])
Sadece düşünebiliriz command
seçenek olarak ayarlanması gerekir istediğimiz yöntemine referans benzer çağrılacak callback
içinde button_press_handle
.
Tartışma olmadan
İstesem Yani eğer print
bir şey düğmesi Sette gerekir basıldığında:
btn['command'] = print # default to print is new line
Çok dikkat edin eksikliği ait ()
olan print
bu anlam atlanırsa yönteme: "Bu basıldığında aramak istediğiniz yöntemin adıdır ama . Sadece bu çok anlık demiyorlar" Ancak, herhangi bir argüman iletmedim, print
böylece argüman olmadan çağrıldığında yazdırılan her şeyi yazdırdı.
İle bağımsız değişken (ler)
Şimdi düğmeye basıldığında çağrılmak istediğim yönteme de argümanlar iletmek istersem lambda deyimi ile oluşturulabilen anonim işlevleri kullanabilirim, bu durumda print
yerleşik yöntem için aşağıdaki gibi :
btn['command'] = lambda arg1="Hello", arg2=" ", arg3="World!" : print(arg1 + arg2 + arg3)
Düğmeye Basıldığında Birden Çok Yöntem Çağırma
Bağımsız Değişken Olmadan
Bunu kullanarak lambda
ifade elde edebilirsiniz ama kötü uygulama olarak kabul edilir ve bu yüzden buraya dahil etmeyeceğim. İyi uygulama, multiple_methods
istenen yöntemleri çağıran ve daha sonra düğmeye basmanın geri çağrısı olarak ayarlanan ayrı bir yöntem tanımlamaktır :
def multiple_methods():
print("Vicariously") # the first inner callback
print("I") # another inner callback
İle bağımsız değişken (ler)
Diğer yöntemleri çağıran yönteme argüman (lar) ı aktarmak için, yine deyimden faydalanın lambda
, ancak önce:
def multiple_methods(*args, **kwargs):
print(args[0]) # the first inner callback
print(kwargs['opt1']) # another inner callback
ve sonra ayarlayın:
btn['command'] = lambda arg="live", kw="as the" : a_new_method(arg, opt1=kw)
Geri Aramadan Nesneleri Geri Getirme
Ayrıca callback
, return
sadece bunun aksine button_press_handle
ile içeride çağrıldığı için bu mümkün değildir . O does ama değil her yerde bu birim dışından. Bu nedenle , geçerli kapsamda erişilebilen nesneleri değiştirmeyi tercih etmelisiniz .callback()
return callback()
return
Global Nesne Değişiklikleri ile Komple Örnek
Aşağıdaki örnek btn
, düğmeye her basıldığında metnini değiştiren bir yöntemi çağırır :
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()
Ayna