2013-02-07 9 views
6

Ich habe viele GUI-Schnittstellen in PyQT mit QT-Designer erstellt, aber jetzt versuche ich, eine Schnittstelle von einem anderen zu öffnen, und ich weiß nicht, wie es geht. Start.py ist die Datei, die die GUI-Schnittstelle Authentification_1 und Acceuil_start.py laufen ist die Datei, die die GUI-Schnittstelle Acceuil_2.py laufen, jetzt habe ich von Start.py zum Mittagessen wollen Acceuil_start .py. Haben Sie eine Ahnung davon? Vielen Dank. Hier ist mein Code:Öffnen Sie eine GUI-Datei aus einer anderen Datei 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_()) 

Antwort

4

Zuerst sollten Sie Ihre GUI-Klassen zu nennen, so dass sie einen anderen Namen haben, und nicht die generische, so konnte man deutliche sie.

Warum müssten Sie das tun? Nun, einfach, weil es Sinn macht - wenn jede Klasse verschiedene Arten von Dialogen repräsentiert, so ist es der andere Typ - und sie sollten anders benannt werden. Einige der Namen sind/können sein: QMessageBox, AboutBox, AddUserDialog, und so weiter.

In Accuil_start.py (Sie sollten auch Klasse in anderen Modul umbenennen).

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_()) 

in der übergeordneten Klasse, wenn Sie das Fenster erstellen möchten, sind Sie in der Nähe (aber es sollte auf jeden Fall funktionieren):

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

Über Ausgabe parent: Wenn Ihr Widget/Fenster ein weiteres Widget erstellen, Schöpfer Objekt Einstellung Eltern zu sein ist immer eine gute Idee (abgesehen von einigen Einzelfällen), und Sie sollten this zu sehen, zu lesen, warum ist das so:

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.

Bearbeiten - Minimal Working Beispiel

Um zu sehen, was ich versuche, Ihnen zu sagen, habe ich ein einfaches Beispiel gebaut. Sie haben zwei Klassen - MainWindow und ChildWindow. Jede Klasse kann ohne eine andere Klasse arbeiten, indem separate Objekte QApplication erstellt werden. Aber, wenn Sie ChildWindow in MainWindow importieren, werden Sie ChildWindow im Schlitz verursachen, der zum singeshot Timer verbunden wird, der in 5 Sekunden auslöst.

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

Vielen Dank. Ist die Elternklasse die Klasse, die die andere öffnen soll? und warum sollte ich den Namen der Klasse in _Acceuil_start.py_ ändern? – Copernic

+0

@Mehdi Ich werde meine Antwort aktualisieren! Funktioniert das bisher? –

+0

Nein, es gibt mir diesen Fehler: _NameError: globaler Name 'Acceuil' ist nicht definiert für: 'self.Acceuil = Acceuil (self)' – Copernic

0

Um den anderen Dialog von Start.py zu verweisen, müssen Sie es mit dem Modulnamen voranstellen, die in diesem Fall ist Acceuil_start. Daher ist es in Ordnung, wenn in jedem Modul doppelte Funktionsnamen vorhanden sind.So würden Sie haben:

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

Wenn Sie jedoch diese aus dem gleichen Prozess ausführen möchten, denken Sie daran, dass Sie nicht zwei app Objekte haben kann. Wahrscheinlich möchten Sie Aceuuil_start.py so strukturieren, dass es sich wie ein Dialog und nicht wie ein Hauptfenster verhält. Wenn es sich um zwei verschiedene Hauptfenster handelt, ist es möglicherweise einfacher, einen anderen Python-Interpreter mit dem Parameter Accueil_start.py als Parameter aufzurufen.

+0

Vielen Dank. es gibt mir 'AttributeError: 'Acceuil' Objekt hat kein Attribut 'exec_' – Copernic

Verwandte Themen