發現問題:
當我使用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)
最終成功傳參: