PyQt5 将变量传递给其他方法

PyQt5 passing variables to other methods

我正在制作自己的 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 是一个存储整数数组的二维列表。 创建新项目时,会创建一个新列表,并且该列表会填充用户的数据。当我将操作连接到方法 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 的长度。例如,如果 self.profiles 的 len 当前为 5,那么 profileFuzzy 中的 'i' 变量将始终收到 5,即使例如第二个配置文件(其中 'i' 应该是 2 ) 被点击。这导致我的软件只加载最后保存的配置文件而不是用户的选择。

我认为我的问题在于我如何将 self.profiles 与 profileFuzzy 方法联系起来。我哪里做错了?

提前致谢。

更改此行:

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)

因此 len(self.profiles) 将在您调用 lambda 时计算,而不是在您创建它时计算。

这是可行的,因为函数引入了新的作用域,所以每次输入 addFuzzyProfile 都会得到一个全新的 index。如果你想在 for 循环中执行此操作,你可以创建一个 returns lambda 的函数:

def create_lambda(index):
    return lambda: self.profileFuzzy(index)

然后使用该函数创建您需要的 lambda。