PyQt4 - Button.connect() 总是收到最后一次迭代索引
PyQt4 - Button.connect() recieves always last iteration index
我正在用 Python3.6、PyQt4 和 SQlite3 做一个软件。该软件由许多学生组成,每个学生都有他们的数据(唯一 ID、姓名、姓氏、地址等)。GUI 有一个列表菜单,显示所有学生的列表。
在列表本身中,我根据我有多少学生进行迭代。布局已完成,它创建了一个名称和 2 个 QPushButton(一个用于生成 PDF,另一个用于删除学生数据)
这是一个例子
在我的代码中,我将列表中每个学生的每个 "Generate a PDF" 按钮都放在 python 列表中,"Delete student" 按钮也是如此。
我的问题是当我给按钮 .clicked.connect(function)
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 with id=2 和 button_3 with id := 3。但据我所知, .connect() 收到的内容不会执行,直到在这种情况下实际单击按钮。所以在 .connect() 被调用的那一刻,这个例子中的值 i 是 3 。因此每个按钮调用 id=3.
的 self.delete_student_data
我发现没有办法像我假装的那样完成这项工作。
希望它像我描述的那样清楚。谢谢!
我使用 functools.partial 模块解决了这个问题。据我了解, partial 接受函数的参数并 'freezes' 它。也许有人更了解这整个行为并且可以更好地解释它。 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))
我正在用 Python3.6、PyQt4 和 SQlite3 做一个软件。该软件由许多学生组成,每个学生都有他们的数据(唯一 ID、姓名、姓氏、地址等)。GUI 有一个列表菜单,显示所有学生的列表。
在列表本身中,我根据我有多少学生进行迭代。布局已完成,它创建了一个名称和 2 个 QPushButton(一个用于生成 PDF,另一个用于删除学生数据)
这是一个例子
在我的代码中,我将列表中每个学生的每个 "Generate a PDF" 按钮都放在 python 列表中,"Delete student" 按钮也是如此。 我的问题是当我给按钮 .clicked.connect(function)
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 with id=2 和 button_3 with id := 3。但据我所知, .connect() 收到的内容不会执行,直到在这种情况下实际单击按钮。所以在 .connect() 被调用的那一刻,这个例子中的值 i 是 3 。因此每个按钮调用 id=3.
self.delete_student_data
我发现没有办法像我假装的那样完成这项工作。
希望它像我描述的那样清楚。谢谢!
我使用 functools.partial 模块解决了这个问题。据我了解, partial 接受函数的参数并 'freezes' 它。也许有人更了解这整个行为并且可以更好地解释它。 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))