Rumah > pembangunan bahagian belakang > Tutorial Python > Mengapa Butang PyQt4 Saya Semua Mencetak Nilai Yang Sama Apabila Disambungkan dalam Gelung?

Mengapa Butang PyQt4 Saya Semua Mencetak Nilai Yang Sama Apabila Disambungkan dalam Gelung?

Mary-Kate Olsen
Lepaskan: 2024-11-11 17:22:03
asal
556 orang telah melayarinya

Why Do My PyQt4 Buttons All Print the Same Value When Connected in a Loop?

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))
Salin selepas log masuk

Contoh dengan functools.partial:

self._numberButtons[i].clicked.connect(partial(self._number, i))
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan