Przykład GUI:
Powiedzmy, że mam GUI:
import tkinter as tk
root = tk.Tk()
btn = tk.Button(root, text="Press")
btn.pack()
root.mainloop()
Co się dzieje po naciśnięciu przycisku
Zobacz, że po btn
naciśnięciu wywołuje własną funkcję, która jest bardzo podobna do button_press_handle
w poniższym przykładzie:
def button_press_handle(callback=None):
if callback:
callback() # Where exactly the method assigned to btn['command'] is being callled
z:
button_press_handle(btn['command'])
Możesz po prostu pomyśleć, że command
opcja powinna być ustawiona jako odwołanie do metody, którą chcemy wywołać, podobnie jak callback
w button_press_handle
.
Wywołanie metody ( oddzwonienie ) po naciśnięciu przycisku
Bez argumentów
Więc gdybym chciał print
coś po wciśnięciu przycisku musiałbym ustawić:
btn['command'] = print # default to print is new line
Zwrócić szczególną uwagę na brak w ()
z print
metody, która została pominięta w ten sposób, że: „Jest to metoda, której nazwa Chcę żebyś zadzwonił po naciśnięciu ale . Nie nazywają to po prostu to bardzo natychmiastowy” Jednak nie przekazałem żadnych argumentów, print
więc wydrukowało wszystko, co drukuje, gdy zostanie wywołane bez argumentów.
Z argumentami
Teraz Gdybym chciał również przekazać argumenty do metody, którą chcę wywołać po naciśnięciu przycisku, mógłbym skorzystać z funkcji anonimowych, które można utworzyć za pomocą wyrażenia lambda , w tym przypadku dla print
metody wbudowanej, jak poniżej :
btn['command'] = lambda arg1="Hello", arg2=" ", arg3="World!" : print(arg1 + arg2 + arg3)
Wywołanie wielu metod po naciśnięciu przycisku
Bez argumentów
Możesz to również osiągnąć za pomocą lambda
stwierdzenia, ale jest to uważane za złą praktykę i dlatego nie będę go tutaj umieszczać. Dobrą praktyką jest zdefiniowanie osobnej metody, multiple_methods
która wywołuje żądane metody, a następnie ustawia ją jako wywołanie zwrotne do przycisku press:
def multiple_methods():
print("Vicariously") # the first inner callback
print("I") # another inner callback
Z argumentami
Aby przekazać argument (y) do metody, która wywołuje inne metody, ponownie użyj lambda
instrukcji, ale najpierw:
def multiple_methods(*args, **kwargs):
print(args[0]) # the first inner callback
print(kwargs['opt1']) # another inner callback
a następnie ustaw:
btn['command'] = lambda arg="live", kw="as the" : a_new_method(arg, opt1=kw)
Zwracanie obiektów z wywołania zwrotnego
Ponadto zauważ, że callback
tak naprawdę nie może, return
ponieważ jest wywoływany tylko wewnątrz button_press_handle
z, callback()
a nie z return callback()
. Czyni return
ale nie nigdzie poza tą funkcją. Dlatego powinieneś raczej modyfikować obiekty, które są dostępne w bieżącym zakresie.
Kompletny przykład z globalnymi modyfikacjami obiektów
Poniższy przykład wywoła metodę, która zmienia btn
tekst po każdym naciśnięciu przycisku:
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()
Lustro