发现问题:
当我使用PyQt5在写一个文本处理小工具时,需要在调用事件时传入参数,于是想到了lambda函数,代码如下:
def radiotext(self):
'''文档输出格式选择功能'''
# 自动生成按钮并命名。其中count_button为存储按钮名称的列表,list_new为存储按钮显示文本的列表
for count, ele_new in zip(count_button, list_new):
# 生成按钮
count = QPushButton(ele_new)
# 关联self.format事件
count.clicked.connect(lambda : self.format(ele_new))
# 按钮样式布局
self.hbox11.addWidget(count)
def format(self, str_select):
'''根据格式按钮生成对应格式功能'''
str = self.lineedit_format.text()
str += str_select
self.lineedit_format.setText(str)
当我执行工具时,发现生成的无论哪个按钮,显示文本都是同一个值,如下图:
分析问题:
后来查阅资料,才发现lambda函数(或称闭包)传递的不是参数的值,而是参数的物理地址,所以lambda传递的参数都会是同一个值。想要解决可以使用functools模块。
解决问题:
导入functools模块,使用partial方法。更改的代码如下:
# 函数工具模块
from functools import partial
def radiotext(self):
'''文档输出格式选择功能'''
# 自动生成按钮并命名。其中count_button为存储按钮名称的列表,list_new为存储按钮显示文本的列表
for count, ele_new in zip(count_button, list_new):
# 生成按钮
count = QPushButton(ele_new)
# 关联self.format事件
count.clicked.connect(partial(self.format, ele_new))
# 按钮样式布局
self.hbox11.addWidget(count)
def format(self, str_select):
'''根据格式按钮生成对应格式功能'''
str = self.lineedit_format.text()
str += str_select
self.lineedit_format.setText(str)
最终成功传参: