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。
我正在制作自己的 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。