我很抱歉,如果已经提出这个问题,但我还没有找到它。我也刚刚开始学习编程,所以很感激反馈。 :)
我的最终目标是创建一个8" x"按下网格,按下时会改变自己的颜色。我想用它制作一个网格,我可以上传到我建造的POV玩具。此代码创建一个包含8个按钮的列,每个按钮都有一个回调,将自身作为参数传递。作为回调函数的想法可以对按钮执行操作,例如更改颜色或删除它。
import Tkinter
def unpack(i):
buttons[i].pack_forget()
print i
top = Tkinter.Tk() buttons = [] for i in range(0, 8):
buttons.append(Tkinter.Button(top, text='Hello', command=lambda: unpack(i)))
for button in buttons:
button.pack()
top.mainloop()
当我这样做时,我得到一个包含8个按钮列的窗口,当我点击其中一个被删除时。当我点击一秒钟没有任何反应。在我的命令提示符下,无论按哪个按钮,我都会打印7号。我怀疑问题出现在创建按钮的for
循环中,但我不知道如何修复它。
谢谢!
答案 0 :(得分:3)
将按钮对象传递给回调函数而不是索引,因为在列表中删除项目后索引会发生变化。
import Tkinter
top = Tkinter.Tk()
for i in range(0, 8):
btn = Tkinter.Button(top, text='Hello')
btn['command'] = lambda b=btn: b.pack_forget()
btn.pack()
top.mainloop()
注意:为防止后期绑定问题,我在上面的代码中使用了default参数。