2015-08-30 124 views
0

我正在制作自己的GUI,并且在此GUI中,我希望用户将其当前工作保存为配置文件。每次他们添加一个配置文件时,我想在菜单栏上添加一个操作,以便他们稍后可以再次打开该配置文件。我在连接方法和菜单栏中的操作项时遇到了问题。PyQt5将变量传递给其他方法

这是我的代码

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是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的长度。例如,如果self.profiles的len当前为5,那么profileFuzzy中的'i'变量将总是接收5,即使例如第二个配置文件(其中'i'应该是2)被点击。这会导致我的软件只加载上次保存的配置文件,而不是用户的选择。

我相信我的问题在于如何将我的self.profiles与profileFuzzy方法连接起来。我哪里错了?

在此先感谢。

回答

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) 

所以len(self.profiles)会在调用lambda时计算,而不是在创建时计算。

这是可行的,因为函数引入了新的示波器,所以每次输入addFuzzyProfile时都会得到新的index。如果你想这样做的for循环,你可以创建一个返回拉姆达功能:

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

然后用函数来创建你需要的lambda表达式。

+0

托马斯嗨,我有一个类似的问题不能用以前的解决方案来解决:因为我在范围 (7): self.roisin [I] .sigRegionChangeFinished.connect(拉姆达:self.manageInputChange (I)) \t \t \t self.roisout [I] .sigRegionChangeFinished.connect(拉姆达:self.manageOutputChange(I)) 将使self.manageInputChange(I)以某种方式评估,以6为他们所有。我已经试过放置一个新变量并用该值填充该变量,但它不起作用。我又在哪里出了问题? 谢谢! –

+0

由于您创建的每个lambda都捕获了对“i”的引用,并且在循环中更改了“i”。这在你原来的问题中没有发生,因为每次你输入函数时都会创建一个新的'index',但** for'循环中只会创建一个**'i'。你可以定义一个返回你需要的lambda的函数。看我的编辑。 –