Python PyQt4-Button.connect()始终接收最后一次迭代索引

Python PyQt4-Button.connect()始终接收最后一次迭代索引,python,pyqt,pyqt4,python-3.6,Python,Pyqt,Pyqt4,Python 3.6,我正在用Python3.6、PyQt4和SQlite3做一个软件。软件由许多学生组成,每个学生都有自己的数据(唯一id、姓名、姓氏、地址等)。GUI有一个列表菜单,显示所有学生的列表 在列表中,我根据我有多少学生进行迭代。布局完成后,创建一个名称和2个QpushButton(一个用于生成PDF,另一个用于删除学生数据) 这里有一个例子 在我的代码中,我有python列表中每个学生的每个“生成PDF”按钮,也有“删除学生”按钮。 我的问题是当我给按钮.clicked.connect(函数)时 例

我正在用Python3.6、PyQt4和SQlite3做一个软件。软件由许多学生组成,每个学生都有自己的数据(唯一id、姓名、姓氏、地址等)。GUI有一个列表菜单,显示所有学生的列表

在列表中,我根据我有多少学生进行迭代。布局完成后,创建一个名称和2个QpushButton(一个用于生成PDF,另一个用于删除学生数据)

这里有一个例子

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

例如,我在列表中有3名学生,因此按钮1应该接收id:1
self。删除学生数据(1)
,然后删除id=2的按钮2和id=3的按钮3。但据我所知,what.connect()receives不会执行,除非在本例中实际单击了按钮。因此,在调用.connect()时,本例中的值i为3。因此,每个按钮都调用id=3的self.delete\u student\u data

我明白没有办法让这一切像我假装的那样顺利


希望它能像我描述的那样清晰。谢谢

我使用functools.partial模块解决了这个问题。据我所知,partial接受函数的参数并“冻结”它。也许有人更了解这整个行为,并能更好地解释它

现在代码如下所示:

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))

我使用functools.partial模块解决了这个问题。据我所知,partial接受函数的参数并“冻结”它。也许有人更了解这整个行为,并能更好地解释它

现在代码如下所示:

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))

SO中的标记提示:始终包含语言标记(即“python”),如果您的问题是针对python 3.6的,请同时添加这两个标记,因为“python-3.6”是“python”的附加标记。当你的问题被正确标记时,会有更多的人阅读/回答你的问题,因为我们通常只在“python”标记部分闲逛。(我已经编辑了这个问题的标记,请下次注意)使用默认参数:
connect(lambda arg,I=I:…
(注意:需要
arg
参数,因为单击的信号总是发送其选中状态)@EKHUMO我不明白您所指的
arg
,arg在哪里使用?在我的delete\u student\u数据函数中?谢谢您的帮助reply@juanga13.您不需要使用它。但它必须存在,否则该信号将用布尔值覆盖
i
参数。当前
lambda
函数的其余部分on可以保持完全相同。在SO中添加标记的提示:始终包含语言标记(即“python”),如果您的问题特定于python 3.6,则添加这两个标记,因为“python-3.6”是“python”的附加标记。如果正确标记了您的问题,会有更多人阅读/回答您的问题,因为我们通常只在“python”中闲逛标记部分。(我已经编辑了这个问题的标记,请下次注意)使用默认参数:
connect(lambda arg,I=I:…
(注意:需要
arg
参数,因为单击的信号总是发送其选中状态)@EKHUMO我不明白您所指的
arg
,arg在哪里使用?在我的delete\u student\u数据函数中?谢谢您的帮助reply@juanga13.您不需要使用它。但它必须存在,否则该信号将用布尔值覆盖
i
参数。当前
lambda
函数的其余部分你可以保持不变。