确定在 Tkinter 中按下了哪个按钮?

Posted

技术标签:

【中文标题】确定在 Tkinter 中按下了哪个按钮?【英文标题】:Determine which Button was pressed in 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 中按下了哪些按钮。关于我如何分辨的任何建议?

【问题讨论】:

【参考方案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)

【讨论】:

以上是关于确定在 Tkinter 中按下了哪个按钮?的主要内容,如果未能解决你的问题,请参考以下文章

swift 3 在tableView 中按下了哪个单元格按钮

如何检测在 PyQt5 中按下了动态添加的按钮之一? [复制]

确定用户按下了哪个按钮

如何告诉 UIViewController 在 UIPopOverController 中按下了按钮?

在 Tkinter 中按下按钮后如何清除 Entry 小部件?

RadGridView 检测 CellClick 事件按钮