确定在 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 必须接受第二个参数,该参数将是一个事件对象。
假设第二个参数称为event
,event.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 中按下了按钮?