Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapa Semua Butang Kalkulator Saya Mencetak Nombor Yang Sama Apabila Disambungkan dalam Gelung dalam PyQt4?
Menyambungkan Slot dan Isyarat PyQt4 dalam Gelung: Menyelesaikan Masalah Hasil Yang Tidak Dijangka
Apabila membina kalkulator dalam PyQt4, butang penyambung 'diklik()' isyarat dalam gelung boleh membawa kepada tingkah laku yang tidak dijangka. Isu timbul kerana nombor yang dijangkakan tidak dicetak apabila butang diklik. Sebaliknya, semua butang mencetak nombor yang sama.
Memahami Masalah
Peraturan skop Python mewujudkan penutupan dalam senario ini. Pembolehubah gelung 'i' digunakan sebagai parameter untuk setiap fungsi lambda butang. Walau bagaimanapun, Python menyelesaikan 'i' dalam ruang nama fungsi yang disertakan (__init__()). Memandangkan 'i' diubah suai dalam gelung dan akhirnya memberikan nilai 9, semua butang merujuk kepada penutupan yang sama, jadi semuanya mengeluarkan '9' tanpa mengira butang yang diklik.
Menyelesaikan Isu
Untuk menyelesaikan isu ini, kita boleh menghantar 'i' sebagai hujah kata kunci dengan nilai lalai. Ini memperkenalkan pengikatan baharu untuk 'i' dalam ruang nama fungsi lambda, menjadikannya bebas daripada 'i' dalam __init__().
Penyelesaian Menggunakan Argumen Kata Kunci:
self._numberButtons[i].clicked.connect(lambda checked, i=i: self._number(i))
Penyelesaian Menggunakan functools.partial:
Pendekatan lain ialah menggunakan functools.partial, yang mencipta fungsi separa dengan argumen pra-terikat. Ini menjadikan kod lebih mudah dibaca dan menghapuskan penggunaan hujah kata kunci.
self._numberButtons[i].clicked.connect(partial(self._number, i))
Dengan melaksanakan penyelesaian ini, setiap butang akan mencetak nombor yang dimaksudkan apabila diklik.
Atas ialah kandungan terperinci Mengapa Semua Butang Kalkulator Saya Mencetak Nombor Yang Sama Apabila Disambungkan dalam Gelung dalam PyQt4?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!