Misalkan saya Button
membuat yang berikut dengan Tkinter dalam Python:
import Tkinter as Tk
win = Tk.Toplevel()
frame = Tk.Frame(master=win).grid(row=1, column=1)
button = Tk.Button(master=frame, text='press', command=action)
Metode action
dipanggil ketika saya menekan tombol, tetapi bagaimana jika saya ingin memberikan beberapa argumen ke metode action
?
Saya sudah mencoba dengan kode berikut:
button = Tk.Button(master=frame, text='press', command=action(someNumber))
Ini hanya memanggil metode segera, dan menekan tombol tidak melakukan apa-apa.
Jawaban:
Saya pribadi lebih suka menggunakan
lambdas
dalam skenario seperti itu, karena itu lebih jelas dan lebih sederhana dan juga tidak memaksa Anda untuk menulis banyak metode pembungkus jika Anda tidak memiliki kendali atas metode yang disebut, tetapi itu tentu saja masalah selera.Begitulah cara Anda melakukannya dengan lambda (perhatikan ada juga beberapa implementasi currying pada modul fungsional, sehingga Anda dapat menggunakannya juga):
sumber
partial
karya dalam kasus ini."This just invokes the method immediately, and pressing the button does nothing"
terjadi?callback=lambda x=x: f(x)
sebagai infs = [lambda x=x: x*2 for x in range(5)] ; print [f() for f in fs]
Ini juga dapat dilakukan dengan menggunakan
partial
dari functools perpustakaan standar , seperti ini:sumber
button = Tk.Button(master=frame, text='press', command=partial(action, arg))
action_with_args = partial(action, arg1, arg2... argN)
Contoh GUI:
Katakanlah saya punya GUI:
Apa Yang Terjadi Saat Tombol Ditekan
Lihat bahwa ketika
btn
ditekan itu memanggil fungsinya sendiri yang sangat mirip denganbutton_press_handle
dalam contoh berikut:dengan:
Anda cukup berpikir bahwa
command
opsi harus ditetapkan sebagai, referensi ke metode yang ingin kita panggil, mirip dengancallback
dibutton_press_handle
.Memanggil Metode ( Callback ) Saat Tombol Ditekan
Tanpa argumen
Jadi jika saya ingin
print
sesuatu ketika tombol ditekan saya perlu mengatur:Perhatikan dekat dengan kurangnya dari
()
denganprint
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 untukprint
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 :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 terpisahmultiple_methods
,, yang memanggil metode yang diinginkan dan kemudian menetapkannya sebagai panggilan balik ke tombol tekan:Dengan Argumen
Untuk meneruskan argumen ke metode yang memanggil metode lain, sekali lagi gunakan
lambda
pernyataan, tetapi pertama-tama:dan kemudian atur:
Mengembalikan Objek Dari Callback
Juga catatan lebih lanjut yang
callback
tidak bisa benar-benarreturn
karena itu hanya disebutbutton_press_handle
dengan yangcallback()
bertentanganreturn callback()
. Itureturn
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:Cermin
sumber
Kemampuan Python untuk memberikan nilai default untuk argumen fungsi memberi kita jalan keluar.
Lihat: http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/extra-args.html
Untuk lebih banyak tombol, Anda dapat membuat fungsi yang mengembalikan fungsi:
sumber
myX
danmyY
bekerja dengan sempurna terima kasih banyak.Membangun di atas Matt Thompsons menjawab: kelas dapat dibuat callable sehingga dapat digunakan sebagai pengganti fungsi:
sumber
Alasan itu memanggil metode segera dan menekan tombol tidak melakukan apa-apa adalah yang
action(somenumber)
dievaluasi dan nilai kembalinya dikaitkan sebagai perintah untuk tombol. Jadi jikaaction
mencetak sesuatu untuk memberi tahu Anda telah berjalan dan kembaliNone
, Anda hanya menjalankanaction
untuk mengevaluasi nilai kembali dan diberikanNone
sebagai perintah untuk tombol.Untuk memiliki tombol untuk memanggil fungsi dengan berbagai argumen, Anda dapat menggunakan variabel global, meskipun saya tidak bisa merekomendasikannya:
Apa yang akan saya lakukan adalah membuat
class
objek yang berisi setiap variabel yang diperlukan dan metode untuk mengubahnya sesuai kebutuhan:sumber
Saya percaya harus memperbaikinya
sumber
Hal terbaik untuk dilakukan adalah menggunakan lambda sebagai berikut:
sumber
Saya sangat terlambat, tetapi di sini ada cara yang sangat sederhana untuk mencapainya.
Anda cukup membungkus fungsi yang ingin Anda gunakan di fungsi lain dan memanggil fungsi kedua pada tombol tekan.
sumber
var1
danvar2
di modul utama, Anda dapat melewatifunction1
semuanya dan memasukkanprint
pernyataanfunction2
. Apakah Anda merujuk pada situasi lain yang saya tidak mengerti?Lambdas semuanya baik dan bagus, tetapi Anda juga dapat mencoba ini (yang berfungsi sebagai for loop btw):
Ini bekerja karena ketika pengikatan diatur, tekan tombol melewati acara sebagai argumen. Anda kemudian dapat memanggil atribut dari acara seperti
event.char
untuk mendapatkan "1" atau "UP" dll. Jika Anda memerlukan argumen atau beberapa argumen selain atribut acara. cukup buat kamus untuk menyimpannya.sumber
Saya pernah mengalami masalah ini sebelumnya. Anda bisa menggunakan lambda:
sumber
Gunakan lambda untuk meneruskan data entri ke fungsi perintah jika Anda memiliki lebih banyak tindakan untuk dilakukan, seperti ini (saya sudah mencoba membuatnya generik, jadi adaptasikan saja):
Ini akan meneruskan informasi dalam acara tersebut ke fungsi tombol. Mungkin ada lebih banyak cara Pythonesque untuk menulis ini, tetapi itu berhasil untuk saya.
sumber
JasonPy - beberapa hal ...
jika Anda menempel tombol dalam satu lingkaran itu akan dibuat berulang-ulang ... yang mungkin bukan yang Anda inginkan. (mungkin ini)...
Alasan selalu mendapatkan indeks terakhir adalah acara lambda berjalan saat Anda mengkliknya - bukan saat program dimulai. Saya tidak yakin 100% apa yang Anda lakukan, tetapi mungkin mencoba menyimpan nilai ketika itu dibuat kemudian menyebutnya nanti dengan tombol lambda.
misalnya: (jangan gunakan kode ini, hanya sebuah contoh)
maka Anda bisa mengatakan ....
semoga ini membantu!
sumber
Salah satu cara sederhana akan mengkonfigurasi
button
denganlambda
seperti sintaks berikut:sumber
Untuk keturunan: Anda juga dapat menggunakan kelas untuk mencapai sesuatu yang serupa. Misalnya:
Tombol kemudian dapat dengan mudah dibuat oleh:
Pendekatan ini juga memungkinkan Anda untuk mengubah argumen fungsi dengan pengaturan yaitu
instance1.x = 3
.sumber
Anda harus menggunakan
lambda:
sumber
Gunakan lambda
keluaran:
sumber