PyQt5将变量传递给其他方法

时间:2015-08-30 14:17:49

标签: python pyqt pyqt5

我正在创建自己的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方法连接起来。我哪里出错?

提前致谢。

1 个答案:

答案 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。