2015-08-30 70 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的函數。看我的編輯。 –