【问题标题】:Determine which Button was pressed in Tkinter?确定在 Tkinter 中按下了哪个按钮?
【发布时间】:2010-12-05 02:48:42
【问题描述】:

我在学习 Python 时正在制作一个简单的小实用程序。它动态生成按钮列表:

for method in methods:
    button = Button(self.methodFrame, text=method, command=self.populateMethod)
    button.pack({'fill': 'x', 'expand': 1, 'padx': 5, 'pady': 3})

那部分工作正常。但是,我需要知道在self.populateMethod 中按下了哪些按钮。关于我如何分辨的任何建议?

【问题讨论】:

    标签: python button tkinter


    【解决方案1】:

    好像命令方法没有传递任何事件对象。

    我可以想到两种解决方法:

    • 为每个按钮关联一个唯一的回调

    • 调用button.bind('<Button-1>', self.populateMethod) 而不是将self.populateMethod 作为command 传递。然后 self.populateMethod 必须接受第二个参数,该参数将是一个事件对象。

      假设第二个参数称为eventevent.widget 是对被点击按钮的引用。

    【讨论】:

    • 我做了第二种方法,它似乎做了我想要的。谢谢!
    • 如果您使用 bind 而不是利用内置的 command 属性,您将无法使用 Tkinter 内置的通过键盘导航和单击按钮的能力。当然,您可以应用一堆绑定来处理所有特殊情况,但使用command 属性会更容易。
    • @BryanOakley:确实;您对使用 lambdas 的建议更简洁。
    • 另外,对于任何考虑使用第二种方法(绑定到单击而不是命令)的人,我不推荐它,因为内置的“命令”非常“类似于按钮”并且会调用该方法仅当确实单击并激活了按钮时。将其绑定到“Button-1”事件可能会触发不希望的行为,例如当您单击该按钮时,即使该按钮已禁用,您的按钮也会调用该方法。
    【解决方案2】:

    您可以使用 lambda 将参数传递给命令:

    def populateMethod(self, method):
        print "method:", method
    
    for method in ["one","two","three"]:
        button = Button(self.methodFrame, text=method, 
            command=lambda m=method: self.populateMethod(m))
        button.pack({'fill': 'x', 'expand': 1, 'padx': 5, 'pady': 3})
    

    【讨论】:

      最近更新 更多