2013-02-07 11 views
6

QT Designerを使用してPyQTに多くのGUIインターフェイスを作成しましたが、別のインターフェイスからインターフェイスを開こうとしています。 Start.pyは今、私は昼食Acceuil_startにStart.pyから欲しい、GUIインタフェースAuthentification_1Acceuil_start.pyを実行し、ファイルがAcceuil_2.py GUIインターフェイスを実行ファイルであります.py。 あなたはそれについて考えていますか?ありがとうございました。 はここに私のコードです:別のファイルからGUIファイルを開くPyQT

Start.py :

import sys 
from PyQt4 import QtCore, QtGui 
from Authentification_1 import Ui_Fenetre_auth 
from Acceuil_2 import Ui_MainWindow #??? Acceuil_2.py is the file which I want to open 

class StartQT4(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self, parent) 
     self.ui = Ui_Fenetre_auth() 
     self.ui.setupUi(self) 

    def authentifier(val): #Slot method 
     self.Acceuil = Acceuil() #??? 
     self.Acceuil.show() #??? 


if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    myapp = StartQT4() 
    myapp.show() 
    sys.exit(app.exec_()) 

Acceuil_start.py

import sys 
from PyQt4 import QtCore, QtGui 
from Authentification_1 import Ui_Fenetre_auth 
from Acceuil_2 import Ui_MainWindow 

class StartQT4(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self, parent) 
     self.ui = Ui_MainWindow() 
     self.ui.setupUi(self) 


if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    myapp = StartQT4() 
    myapp.show() 
    sys.exit(app.exec_()) 

答えて

4

まず、あなたは彼らが別の名前ではなく、一般的なものを持っているので、あなたのGUIクラスに名前を付けるべきで、あなたは明確な彼らでした。

なぜあなたはそれを行う必要がありますか?まあ、それは理にかなっているからです。すべてのクラスが異なるタイプのダイアログを表現しているならば、それは異なるタイプなので、異なる名前を付ける必要があります。名前の一部は、QMessageBox,AboutBox,AddUserDialogなどとなります。

Acceuil_start.py(ほかのモジュールでもクラスの名前を変更する必要があります)。あなたは、ウィンドウを作成する場合、親クラスの

import sys 
from PyQt4 import QtCore, QtGui 
from Authentification_1 import Ui_Fenetre_auth 
from Acceuil_2 import Ui_MainWindow 

class Acceuil(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self, parent) 
     self.ui = Ui_MainWindow() 
     self.ui.setupUi(self) 


if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    myapp = Acceuil() 
    myapp.show() 
    sys.exit(app.exec_()) 

、あなたは(それがどのような場合には動作するはずです)近くにあります:

def authentifier(val): #Slot method 
    self.Acceuil = Acceuil(self) # You should always pass the parent to the child control 
    self.Acceuil.show() #??? 

親の問題について:あなたのウィジェット/ウィンドウがある場合別のウィジェットを作成し、親であることを作成者オブジェクトを設定することは常に良い考えです(離れていくつかの特異例から)、あなたがそうということです理由はthisをお読みください:

QObjects organize themselves in object trees. When you create a QObject with another object as parent, it's added to the parent's children() list, and is deleted when the parent is. It turns out that this approach fits the needs of GUI objects very well. For example, a QShortcut (keyboard shortcut) is a child of the relevant window, so when the user closes that window, the shorcut is deleted too.

編集 - 最小限の作業サンプル

私があなたに伝えたいことを見るには、私は簡単な例を作りました。 MainWindowChildWindowの2つのクラスがあります。別々のQApplicationオブジェクトを作成することによって、すべてのクラスが別のクラスなしで動作することができます。しかし、MainWindowChildWindowをインポートすると、5秒後にトリガーされるsingleshotタイマーに接続されたスロットにChildWindowが作成されます。

MainWindow.py:

import sys 
from PyQt4 import QtCore, QtGui 
from ChildWindow import ChildWindow 

class MainWindow(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self, parent) 
     QtCore.QTimer.singleShot(5000, self.showChildWindow) 


    def showChildWindow(self): 
     self.child_win = ChildWindow(self) 
     self.child_win.show() 

if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    myapp = MainWindow() 
    myapp.show() 
    sys.exit(app.exec_()) 

ChildWindow.py:

import sys 
from PyQt4 import QtCore, QtGui 

class ChildWindow(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self, parent) 
     self.setWindowTitle("Child Window!") 


if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    myapp = ChildWindow() 
    myapp.show() 
    sys.exit(app.exec_()) 
+0

ありがとうございます。 Isは親クラスで、もう1つは開きたいクラスですか?なぜ私は_Acceuil_start.py_でクラスの名前を変更する必要がありますか? – Copernic

+0

@Mehdi私は私の答えを更新します!これはこれまでのところ動作しますか? –

+0

いいえ、これは私にこのエラーを与えます:_NameError:グローバル名 'Acceuil'は定義されていません: 'self.Acceuil = Acceuil(self)' – Copernic

0

Start.pyから他のダイアログを参照するには、このケースであるモジュール名によってそれを前に付ける必要がありますAcceuil_start。したがって、各モジュールに機能名が重複していれば問題ありません。だから、あなたが持っているでしょう:あなたは、これらは同じプロセスから実行したい場合は

def authentifier(val): #Slot method 
    dlg = Acceuil_start.StartQT4() 
    dlg.exec_() 

をしかし、あなたは2つのappオブジェクトを持つことができないことに注意してください。 Acceuil_start.pyをメインウィンドウではなくダイアログのように構成することをお勧めします。これらが2つの異なるメインウィンドウである場合、Acceuil_start.pyをパラメータとして別のPythonインタプリタを呼び出す方が簡単です。

+0

ありがとう。 'AttributeError: 'Acceuil'オブジェクトに属性 'exec_''がありません – Copernic

関連する問題