我正在创建自己的GUI,在此GUI中,我希望用户将当前的工作保存为配置文件。每次添加配置文件时,我都想在菜单栏上添加一个操作,以便以后再次打开该配置文件。我在将该方法与菜单栏内的操作项连接时遇到问题。
这是我的代码
def addFuzzyProfile(self):
self.fuzzyProfile.append([])
self.fuzzyProfile[-1] = self.fuzzyInput + self.fuzzyOutput
self.profiles.append([])
self.profiles[-1] = QAction('&Testing',self)
self.profiles[-1].triggered.connect(lambda: self.profileFuzzy(len(self.profiles)-1))
self.profileMenu.addAction(self.profiles[-1])
print(len(self.profiles)-1)
self.profiles是一个存储int数组的2D列表。 创建新项目时,将创建一个新列表,并使用用户的数据填充该列表。当我将动作连接到方法self.profileFuzzy时会出现问题。
以下是方法profileFuzzy:
def profileFuzzy(self, i):
try:
print('iiiiii')
print(i)
self.fuzzyInput = self.fuzzyProfile[i][0:28]
self.fuzzyOutput = self.fuzzyProfile[i][28:56]
self.motorFuzzy()
except Exception as e:
print(e)
现在,每当添加新项时,profileFuzzy方法中的i变量仅在该点接收self.profiles的长度。例如,如果len的self.profiles目前是5,那么' i' profileFuzzy中的变量将始终收到5,即使例如第二个配置文件(其中' i应该是2)被点击。这导致我的软件仅加载上次保存的配置文件而不是用户的选择。
我相信我的问题在于如何将我的self.profiles与profileFuzzy方法连接起来。我哪里出错?
提前致谢。
答案 0 :(得分:1)
更改此行:
self.profiles[-1].triggered.connect(lambda: self.profileFuzzy(len(self.profiles)-1))
成:
index = len(self.profiles) - 1
self.profiles[-1].triggered.connect(lambda: self.profileFuzzy(index))
要清楚地看到它,请将原始lambda表达式写为嵌套函数:
def nested_func():
return self.profileFuzzy(len(self.profiles)-1)
因此,当您调用lambda时,将计算len(self.profiles)
,而不是在创建它时计算。
这很有效,因为函数引入了新的范围,因此每次输入addFuzzyProfile
时,您都会得到一个全新的index
。如果要在for
循环中执行此操作,可以创建一个返回lambda的函数:
def create_lambda(index):
return lambda: self.profileFuzzy(index)
然后使用该函数创建你需要的lambdas。