Python 如何从命令中识别按钮?

Python 如何从命令中识别按钮?,python,events,button,tkinter,tkinter-entry,Python,Events,Button,Tkinter,Tkinter Entry,我已经在for循环中创建了一个条目列表。所有条目都存储在一个列表中,因此我可以稍后获取所有输入: inputs = [e.get() for e in self.entries] 但是,我还在for循环中的每个条目旁边创建了一个按钮(因此它们都调用相同的函数)。如何使其识别哪个按钮属于哪个行/条目?我能为这次活动做些什么吗 row = 0 self.entries = [] self.comments = [] for n in names: e = Entry(self.top, bd

我已经在for循环中创建了一个条目列表。所有条目都存储在一个列表中,因此我可以稍后获取所有输入:

inputs = [e.get() for e in self.entries]
但是,我还在for循环中的每个条目旁边创建了一个按钮(因此它们都调用相同的函数)。如何使其识别哪个按钮属于哪个行/条目?我能为这次活动做些什么吗

row = 0
self.entries = []
self.comments = []
for n in names:
   e = Entry(self.top, bd = 5)
   e.insert(0, n)
   e.grid(column = 1, row = self.row, sticky = 'NSWE', padx = 5, pady = 5)
   self.entries.append(e)
   self.comments += [""]
   commentButton = Button(self.top, text = "comment", command = self.commentSelected)
   commentButton.grid(column = 3, row = self.row, sticky = 'NSWE', padx = 5, pady = 5)
   self.row = self.row + 1
是--使用回调函数(Currying函数) (罗素·欧文提供)

我发现我经常希望将额外的数据传递给回调函数,除了通常给定的数据。例如,Button小部件不向其命令回调发送参数,但我可能希望使用一个回调函数来处理多个按钮,在这种情况下,我需要知道按下了哪个按钮

处理这种情况的方法是在将回调函数传递给小部件之前定义回调函数,并包含所需的任何额外信息。不幸的是,与大多数语言一样,Python不能很好地处理早期绑定(定义函数时已知的信息)和后期绑定(调用函数时已知的信息)的混合。我个人认为最简单、最干净的解决方案是:

编写回调函数,将所有需要的数据作为参数。 使用回调垫片类创建一个可调用对象,该对象存储我的函数和额外参数,并在调用时执行正确的操作。换句话说,它使用保存的数据加上调用者提供的数据调用my函数。 我希望下面给出的例子能更清楚地说明这一点

我使用的回调垫片是RO.Alg.GenericCallback,它在我的RO包中提供。下面的示例中给出了一个不处理关键字参数的简化版本。所有的垫片代码都基于Scott David Daniels的python配方,他将其称为“对函数进行处理”(一个可能比“回调垫片”更常见的术语)


您还可以使用
lambda

from tkinter import *

def bla(b):
   ...

root = Tk()

buttons = []
for i in range(...):
    button = Button(root)
    button.configure(command=lambda b=button: bla(b))  # Make sure the Button object already exists
    buttons.append(button)
    button.pack()

root.mainloop()

据我所知,您现在无法在单个列表中创建按钮,但它比类imho更简单、可读性更强。

您可以保留按钮的关联,以便在条目中输入。self.entries.append((e,commentButton))并使用[(e.get(),b)for e,b in self.entries]获取它感谢Russell Owen长期以来的努力
from tkinter import *

def bla(b):
   ...

root = Tk()

buttons = []
for i in range(...):
    button = Button(root)
    button.configure(command=lambda b=button: bla(b))  # Make sure the Button object already exists
    buttons.append(button)
    button.pack()

root.mainloop()