【问题标题】:Buttons to remove themselves in Tkinter在 Tkinter 中删除自身的按钮
【发布时间】:2015-01-23 00:03:04
【问题描述】:

很抱歉,如果已经有人问过这个问题,但我没能找到它。我也刚刚开始学习编程,因此非常感谢您的反馈。 :)

我的最终目标是创建一个 8 x“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 循环中,但我不知道如何解决。

谢谢!

【问题讨论】:

    标签: python python-2.7 tkinter


    【解决方案1】:

    将按钮对象而不是索引传递给回调函数,因为在列表中删除项目后索引会发生变化。

    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()
    

    注意:为了防止后期绑定问题,我在上面的代码中使用了默认参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-06
      • 2021-11-18
      • 1970-01-01
      • 2020-03-30
      • 2020-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多