PyQt4 - Button.connect()总是接收最后一次迭代索引

问题描述:

我正在用Python3.6,PyQt4和SQlite3做一个软件。该软件由许多学生组成,每个学生都有他们的数据(唯一的ID,姓名,地址等)。GUI有一个列表菜单,是所有学生的列表。PyQt4 - Button.connect()总是接收最后一次迭代索引

在列表本身中,我根据有多少学生进行迭代。布局是由它创建了一个名字和2个QPushButtons(一个生成PDF和其他删除的学生数据)

下面是一个例子

在我的代码,我有每个学生在Python列表中的每个“生成PDF”按钮,也是“删除学生”按钮。 我的问题是,当我给的按钮.clicked.connect(功能)

for i in range(0, len(self.list_menu.delete_button_list)): 
    self.list_menu.delete_button_list[i].clicked.connect(
     lambda: self.delete_student_data(self.list_menu.id_list[i])) 

例如,我有3名学生名单上,所以按钮1应收到ID:1 self.delete_student_data(1),然后button_2使用id = 2和button_3,id:= 3。但根据我的理解,.connect()接收的内容不会执行,直到在这种情况下实际单击此按钮。所以此刻.connect()被调用,在这个例子中我的值是3。因此,每个按钮都会调用id = 3的self.delete_student_data

我发现没有办法让这项工作像我假装的那样。

希望它清楚我描述它的方式。谢谢!

+0

一种用于SO标记提示:一定要包括语言标签(即“蟒蛇”),如果你的问题是具体到Python 3.6,添加两个标签,因为“python-3.6”是“python”的附加标签。由于我们通常只在“python”标签部分进行环聊,所以更多人会在正确标记时阅读/回答您的问题。 (我已经为这个问题编辑了标签,下次请注意) – abccd

+1

使用默认参数:'connect(lambda arg,i = i:...'(注意:因为点击的信号总是需要'arg'参数发送它的checked状态) – ekhumoro

+0

@ekhumoro我不明白你指的'arg',在我的delete_student_data函数中使用了arg吗?感谢回复 –

我使用functools.partial模块解决了这个问题。从我所了解的情况来看,部分取决于函数的参数并“冻结”它。也许有人知道这整个行为更好,可以更好地解释它。 Here is the documentation

现在的代码如下:

for i in range(0, len(self.list_menu.delete_button_list)): 
button = self.list_menu.delete_button_list[i] 
button.clicked.connect(partial(self.delete_student_data, button))