Ö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
btnBası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 commandseçenek olarak ayarlanması gerekir istediğimiz yöntemine referans benzer çağrılacak callbackiçinde button_press_handle.
Tartışma olmadan
İstesem Yani eğer printbir şey düğmesi Sette gerekir basıldığında:
btn['command'] = print # default to print is new line
Çok dikkat edin eksikliği ait ()olan printbu 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, printbö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 printyerleş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 lambdaifade elde edebilirsiniz ama kötü uygulama olarak kabul edilir ve bu yüzden buraya dahil etmeyeceğim. İyi uygulama, multiple_methodsistenen 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, returnsadece bunun aksine button_press_handleile 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