2014-10-28 44 views
0

我目前正在爲我的PyQt GUI實現模型視圖體系結構。這是目前我的代碼更簡單但代表性的版本。PyQt,當按下按鈕連接到不同類的方法時,代碼永遠不會退出__init__

class Model(QtGui.QWidget): 
    def __init__(self): 
     super(Model, self).__init__() 
     self.openDir = '/some/file/dir/' 
    def openFile(self): 
     openFileName = QtGui.QFileDialog.getOpenFileName(None, "Open File",self.openDir,"AllFiles(*.*)") 
     openFile = open(openFileName, 'r') 
     ... 

class View(QtGui.QWidget): 
    def__init__(self): 
    super(View, self).__init__() 
    ... 
    self.button = QtGui.QPushButton("Open") 
    ... 
    self.button.clicked.connect(Model().openFile) 

if __name__ == '__main__': 
    app = QtGui.QApplication(sys.argv) 
    mainWindow = View() 
    mainWindow.show() 
    sys.exit(app.exec_()) 

所以,當我點擊「打開」按鈕,我想打電話給ModelopenFile方法,但是當我做單擊它,它進入Model.__init__但它從來沒有真正進入openFile方法。我需要解決什麼問題?


編輯1:修正了所有錯誤。


編輯2:對於那些面臨類似問題的人,這裏是Fred S提供的解決方案和固定代碼。

class Model(QtGui.QWidget): 
    def __init__(self): 
     super(Model, self).__init__() 
     self.openDir = '/some/file/dir/' 
    def openFile(self): 
     openFileName = QtGui.QFileDialog.getOpenFileName(None, "Open File",self.openDir,"AllFiles(*.*)") 
     openFile = open(openFileName, 'r') 
     ... 

class View(QtGui.QWidget): 
    def__init__(self): 
    super(View, self).__init__() 
    ... 
    self.button = QtGui.QPushButton("Open") 
    ... 
    self.model = Model() 
    self.button.clicked.connect(self.model.openFile) 

if __name__ == '__main__': 
    app = QtGui.QApplication(sys.argv) 
    mainWindow = View() 
    mainWindow.show() 
    sys.exit(app.exec_()) 

回答

0

嗯,我的機器上沒有PyQt4,但我有PySide。以下是我在運行代碼時看到的內容:

1)super(Model, self).__init__(parent)崩潰。 「父母」沒有定義。

2)open = open(openFileName, 'r')非常糟糕。你正在重新定義一個內置的。

3)self.loadDir似乎不存在。

4)但對於你的問題,如果我改變

self.button.clicked.connect(Model().openFile) 

是:

self.model = Model() 
self.button.clicked.connect(self.model.openFile) 

那麼問題似乎解決。但是這在PySide中,所以可能不在PyQt4中。祝你好運。

+0

謝謝你弗雷德!一旦我回到我的機器,我會嘗試它。根據你的筆記:1)哎呀,我正在抄錄,忘記忽略父母。它應該是'super(Model,self).__ init __()'2)錯別字對不起,應該是'openFile = open(openFileName,'r')'3)'self.loadDir == self.openDir' 4)我隱約記得嘗試這個,但是當我回到我的機器時我會確定地知道。我在原來的問題中改變了所有這些。 – Krin123 2014-10-28 17:39:18

+0

謝謝Fred!這就像魅力:)你可能可以向我解釋爲什麼self.model.openFile工作,但模型()。openFile不起作用?是否因爲你必須首先初始化實例? – Krin123 2014-10-28 20:11:33

+0

LOL我希望我知道如何解決這個問題,而無需反覆試驗。我已經使用了一年多的pyside,而且我仍然發現我無法解釋的奇怪故障。它和PyQt4之間的奇怪差異。 – 2014-10-28 20:22:26

相關問題