Dalam Tkinter, mencipta butang dalam gelung untuk boleh memberikan cabaran apabila cuba mengikat setiap arahan butang dengan hujah yang unik.
Pertimbangkan perkara berikut senario:
def createGameURLs(self): self.button = [] for i in range(3): self.button.append(Button(self, text='Game '+str(i+1), command=lambda: self.open_this(i))) self.button[i].grid(column=4, row=i+1, sticky=W) def open_this(self, myNum): print(myNum)
Apabila melaksanakan kod ini, anda mungkin menghadapi gelagat pelik di mana menekan sebarang butang sentiasa mencetak nilai yang sama, biasanya nilai lelaran terakhir. Ini berlaku kerana setiap fungsi lambda yang dicipta dalam gelung merujuk pembolehubah i yang sama, yang dikemas kini dalam setiap lelaran gelung.
Untuk menangani isu ini, anda boleh memanfaatkan penutupan Python dengan memberikan i kepada pembolehubah baharu dalam fungsi lambda, dengan berkesan mencipta skop unik untuk setiap butang. Berikut ialah kod yang diubah suai:
def createGameURLs(self): self.button = [] for i in range(3): self.button.append(Button(self, text='Game '+str(i+1), command=lambda i=i: self.open_this(i))) self.button[i].grid(column=4, row=i+1, sticky=W) def open_this(self, myNum): print(myNum)
Dengan memasukkan penutupan, setiap fungsi lambda menangkap nilai semasa i pada masa definisi, memastikan kelakuan butang yang betul.
Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan Tingkah Laku Tidak Dijangka Apabila Mengikat Perintah pada Butang Dicipta dalam Gelung Tkinter?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!