Contoh GUI:
Katakanlah saya punya GUI:
import tkinter as tk
root = tk.Tk()
btn = tk.Button(root, text="Press")
btn.pack()
root.mainloop()
Apa Yang Terjadi Saat Tombol Ditekan
Lihat bahwa ketika btn
ditekan itu memanggil fungsinya sendiri yang sangat mirip dengan button_press_handle
dalam contoh berikut:
def button_press_handle(callback=None):
if callback:
callback() # Where exactly the method assigned to btn['command'] is being callled
dengan:
button_press_handle(btn['command'])
Anda cukup berpikir bahwa command
opsi harus ditetapkan sebagai, referensi ke metode yang ingin kita panggil, mirip dengan callback
di button_press_handle
.
Memanggil Metode ( Callback ) Saat Tombol Ditekan
Tanpa argumen
Jadi jika saya ingin print
sesuatu ketika tombol ditekan saya perlu mengatur:
btn['command'] = print # default to print is new line
Perhatikan dekat dengan kurangnya dari ()
dengan print
metode yang dihilangkan dalam arti bahwa: "Ini adalah nama metode yang saya ingin Anda untuk panggilan ketika ditekan tapi . Tidak menyebutnya hanya sangat instan ini" Namun, saya tidak memberikan argumen untuk print
itu sehingga mencetak apa pun yang dicetak ketika dipanggil tanpa argumen.
Dengan Argumen
Sekarang Jika saya ingin juga memberikan argumen pada metode yang ingin saya panggil ketika tombol ditekan, saya dapat menggunakan fungsi anonim, yang dapat dibuat dengan pernyataan lambda , dalam hal ini untuk print
metode bawaan, seperti berikut ini :
btn['command'] = lambda arg1="Hello", arg2=" ", arg3="World!" : print(arg1 + arg2 + arg3)
Memanggil Banyak Metode saat Tombol Ditekan
Tanpa Argumen
Anda juga dapat mencapai itu menggunakan lambda
pernyataan tetapi dianggap praktik buruk dan karenanya saya tidak akan memasukkannya di sini. Praktik yang baik adalah mendefinisikan metode terpisah multiple_methods
,, yang memanggil metode yang diinginkan dan kemudian menetapkannya sebagai panggilan balik ke tombol tekan:
def multiple_methods():
print("Vicariously") # the first inner callback
print("I") # another inner callback
Dengan Argumen
Untuk meneruskan argumen ke metode yang memanggil metode lain, sekali lagi gunakan lambda
pernyataan, tetapi pertama-tama:
def multiple_methods(*args, **kwargs):
print(args[0]) # the first inner callback
print(kwargs['opt1']) # another inner callback
dan kemudian atur:
btn['command'] = lambda arg="live", kw="as the" : a_new_method(arg, opt1=kw)
Mengembalikan Objek Dari Callback
Juga catatan lebih lanjut yang callback
tidak bisa benar-benar return
karena itu hanya disebut button_press_handle
dengan yang callback()
bertentangan return callback()
. Itu return
tetapi tidak di mana pun di luar fungsi itu. Dengan demikian, Anda sebaiknya memodifikasi objek yang dapat diakses dalam lingkup saat ini.
Contoh Lengkap dengan Modifikasi Objek global
Contoh di bawah ini akan memanggil metode yang mengubah btn
teks setiap kali tombol ditekan:
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()
Cermin