特金特。创建具有“不同”命令功能的多个按钮

Posted

技术标签:

【中文标题】特金特。创建具有“不同”命令功能的多个按钮【英文标题】:Tkinter. Create multiple buttons with "different" command function 【发布时间】:2015-01-27 16:21:12 【问题描述】:

首先,抱歉标题,我找不到更好的。

以下代码是我在 Python 程序中遇到的问题的最小化版本(顺便说一句,我是新手。)。

def onClick(i):
    print "This is Button: " + str(i)
    return

def start():
    b = [0 for x in range(5)]
    win = Tkinter.Tk()
    for i in range(5):
        b[i] = Tkinter.Button(win,height=10,width=100,command=lambda : onClick(i))
        b[i].pack()
    return

它的作用: 无论我点击什么按钮,它都会显示“这是按钮:4”。

我想要的: 第一个按钮应该说“这是按钮:0”等等。

这是 Python 想要的行为吗?如果答案是肯定的,为什么会这样?我该如何解决?

另一方面,这很好用:

def start():        
    x = [0 for x in range(5)]
    for i in range(5):
        x[i] = lambda:onClick(i)
        x[i]()
    return

【问题讨论】:

【参考方案1】:

使用默认参数来避免后期绑定问题(否则 i 在调用 lambda 函数时绑定,而不是在创建时绑定):

def start():
    buttons = []
    win = Tkinter.Tk()
    for i in range(5):
        b = Tkinter.Button(win, height=10, width=100, command=lambda i=i: onClick(i))
        b.pack()
        buttons.append(b)

【讨论】:

我如何在onClick() 中使用i 例如更改buttons[i] 颜色? 找到了。 buttons[i] 是对象的引用,因此,您只能使用 buttons[i].config(fg = "red") 来执行此操作。很好的答案。谢谢。

以上是关于特金特。创建具有“不同”命令功能的多个按钮的主要内容,如果未能解决你的问题,请参考以下文章

具有多个 UILabel 和图像的自定义按钮

具有不同链接的多个社交分享按钮

具有多个不同提交按钮的 MVC 剃须刀表单?

创建具有多个标签的自定义按钮

PHP:具有不同名称的多个按钮以使用 AJAX 更新 MySQL 数据库

Android Webview问题:如何在单个活动中打开具有不同按钮的不同页面