Menyambungkan Slot dan Isyarat dalam PyQt4 dalam Gelung: Memutuskan Rantaian Pengikat
Dalam artikel ini, kami menangani isu biasa yang dihadapi semasa menyambung clicked() isyarat daripada butang yang dibuat dalam gelung dalam PyQt4. Kami berhasrat untuk memahami sebab semua butang mencetak nilai yang sama, walaupun menjangkakan bahawa setiap butang harus mencetuskan tindakan unik berdasarkan labelnya.
Memahami Skop dan Penutupan
Tingkah laku yang diperhatikan dalam contoh yang disediakan adalah akibat daripada mekanisme skop dan penutupan Python. Apabila membuat butang di dalam gelung, kami cuba menyambungkan isyarat yang diklik() kepada fungsi lambda. Walau bagaimanapun, Python hanya memperkenalkan pengikatan baharu dalam ruang nama melalui tugasan atau senarai parameter fungsi.
Oleh itu, fungsi lambda tidak mempunyai pengikatan sendiri untuk pembolehubah gelung i, dan sebaliknya mencarinya dalam ruang nama fungsi melampirkan, __init__(). Pada masa lambda dilaksanakan, saya telah diberikan nilai akhir 9, membawa kepada semua butang mencetak keluaran yang sama.
Resolusi
Untuk menangani isu ini, kita boleh menghantar i sebagai hujah kata kunci dengan nilai lalai kepada fungsi lambda. Ini memastikan bahawa i dalam lambda adalah bebas daripada i dalam __init__(). Sebagai alternatif, kita boleh menggunakan fungsi functools.partial, yang menyediakan pendekatan yang lebih mudah dibaca dan kurang "ajaib" untuk mencapai hasil yang sama.
Contoh dengan Hujah Kata Kunci:
self._numberButtons[i].clicked.connect(lambda checked, i=i: self._number(i))
Contoh dengan functools.partial:
self._numberButtons[i].clicked.connect(partial(self._number, i))
Dengan melaksanakan salah satu pendekatan ini, kami berjaya mewujudkan pengikatan yang diingini antara setiap butang dan tindakan masing-masing.
Atas ialah kandungan terperinci Mengapa Butang PyQt4 Saya Semua Mencetak Nilai Yang Sama Apabila Disambungkan dalam Gelung?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!