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

时间:2017-09-04 23:38:36

标签: python pyqt pyqt4 python-3.6

我正在用Python3.6,PyQt4和SQlite3做一个软件。该软件包括许多学生,每个学生都有他们的数据(唯一的ID,姓名,姓氏,地址等).GUI有一个列表菜单,显示了所有学生的列表。

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

这是一个例子

在我的代码中,我有每一个"生成PDF" python列表中列表中每个学生的按钮,也用于"删除学生"纽扣。 我的问题是当我给按钮.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),然后是id = 2的button_2和id = 3的button_3。但是从我所理解的情况来看,什么.connect()接收不执行,直到在这种情况下实际点击按钮。因此,此时调用.connect(),在此示例中值i为3。因此,每个按钮都会调用id {3的self.delete_student_data

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

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

1 个答案:

答案 0 :(得分:0)

我使用functools.partial模块解决了这个问题。根据我的理解,部分采用了函数的论证,并且冻结了#39;它。也许有人知道这整个行为并且可以更好地解释它。 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))