2017-01-22 21 views
1

我正在Python中製作一個大型程序,並且使用PyQt作爲GUI。整個計劃分爲不同的模塊,以便不同的人可以同時進行工作,而不會干擾別人的工作。從父窗口小部件的函數中訪問對象函數

我現在在3個不同的模塊上工作。 1是處理基本用戶界面的主程序窗口,併爲主窗口分配小部件(這並不重要,只是讓你知道代碼看起來不像完整程序的原因)。

首先是小部件:

import sys 
from PyQt4 import QtCore 
from PyQt4 import QtGui 
from CustomButton import HoverButton #just a custom button class 
from CustomGif import LblLoadingGif #where things go wrong 

class Page1(QtGui.QWidget):  
    def __init__(self, parent=None): 
     super(Page1, self).__init__(parent) 

     self.lbl1GIF = LblLoadingGif(self) 
     self.lbl1GIF.move(400, 45) 

     self.btnStart = HoverButton(self) 
     self.btnStart.setText('Start') 
     self.btnStart.move(35, 400) 
     self.btnStart.clicked.connect(self.actStartGif) 
     #the code below works, but then I can only perform 1 action with each button 
     #self.btnStart.clicked.connect(self.lbl1GIF.actStart) 

    def actStartGif(self): 
     self.lbl1GIF.actStart 

自定義GIF的代碼如下:

import sys 
from PyQt4 import QtCore 
from PyQt4 import QtGui 

class LblLoadingGif(QtGui.QLabel): 

    def __init__(self, parent=None): 
     QtGui.QLabel.__init__(self, parent) 
     self.setStyleSheet('background: url();') 
     self.setScaledContents(True) 
     self.resize(100, 100) 
     self.movLoadGif = QtGui.QMovie('Resources_Images/Loading6.gif', QtCore.QByteArray()) 
     self.movLoadGif.setCacheMode(QtGui.QMovie.CacheAll) 
     self.movLoadGif.setSpeed(100) 
     self.setMovie(self.movLoadGif) 
     self.hide() 

    def actStart(self, event): 
     #print('test1') 
     self.show() 
     self.movLoadGif.start() 

    def actStop(self, event): 
     #print('test1') 
     self.hide() 
     self.movLoadGif.stop() 

所以問題是,我可以使用actStart功能就好了,當我直接調用它從按鈕的點擊,而不是在我通過另一個函數來調用它。當使用actStartGif函數調用自定義gif的actStart時,我使用了很多不同的括號,自我,Page1變體。

任何幫助將不勝感激。

+0

所以在側actStartGif調用self.lbl1GIF.actStart失敗了,對不對? 你得到的實際錯誤是什麼? 1)actStart是一個函數,所以你應該添加括號:self.lbl1GIF.actStart()。 2)並且由於actStart似乎期待一個事件參數(這不是明顯使用的),您還應該傳遞該參數:self.lbl1GIF.actStart(無) –

+0

完美!添加'(無)'括號解決了它。但要回答你的問題,我沒有從調用函數的反應。 我想這是因爲我使用一個模塊作爲主程序的輪廓,然後每次只加載小部件。這有助於在少數人希望工作在不同頁面時不必擔心重疊程序或其代碼彼此衝突。這就是爲什麼這個類只是名爲Page1而且沒有'if __name__ =='__main__':'給出的代碼。 感謝您的幫助 –

回答

0

當你使用連接時,必須傳遞函數的名字,因爲它在內部負責調用它,在你的情況下,你必須直接調用它,所以你必須傳遞它的參數,在這種情況下,事件

self.lbl1GIF.actStart({your value for event}) 

我不明白爲什麼你用事件發生在你身上無:

def actStartGif(self): 
    self.lbl1GIF.actStart(None) 
+0

這是我第一次不得不使用PyQt,所以我是使用對象和對象相關函數的新手。 「(無)」括號完美地完成了這個技巧,謝謝 –