2013-02-07 9 views
6

stworzyłem wiele interfejsów GUI w pyqt użyciu Qt Designer, ale teraz próbuję otworzyć interfejs od drugiego, i nie wiem jak to zrobić .. Start.py jest plik, który uruchomienia interfejsu GUI Authentification_1 i Acceuil_start.py jest plikiem, który należy uruchomić interfejs GUI Acceuil_2.py, teraz chcę z Start.py do lunchu Acceuil_start .py. Czy masz jakiś pomysł na ten temat? Dziękuję Ci. Oto mój kod:Otwórz plik GUI z innego pliku 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_()) 

Odpowiedz

4

pierwsze, należy wymienić swoje klasy GUI więc mają inną nazwę, a nie generyczny jeden, więc mogłem odrębne im.

Dlaczego musiałbyś to zrobić? Cóż - po prostu dlatego, że ma to sens - jeśli każda klasa reprezentuje inny typ okna dialogowego, więc jest to inny typ - i powinna być nazwana inaczej. Niektóre z nazw są/mogą być: QMessageBox, AboutBox, AddUserDialog i tak dalej.

W Acceuil_start.py (należy zmienić nazwę klasy w innym module, zbyt).

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

w klasie nadrzędnej, gdy chcesz utworzyć okno, jesteś blisko (ale powinien działać w każdym przypadku):

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

O kwestii nadrzędnej: Jeżeli okno/widżet jest tworząc kolejny widżet, ustawienie obiektu twórca być rodzicem jest zawsze dobry pomysł (oprócz pewnych osobliwych przypadków), a powinieneś przeczytać this zrozumieć, dlaczego tak jest:

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.

Edytuj - Minimalna robocza próbka

Aby zobaczyć, co próbuję ci powiedzieć, stworzyłem prosty przykład. Masz dwie klasy - MainWindow i ChildWindow. Każda klasa może pracować bez innej klasy, tworząc oddzielne obiekty. Ale jeśli zaimportujesz ChildWindow w MainWindow, utworzysz ChildWindow w gnieździe podłączonym do timera singleshot, który uruchomi się po 5 sekundach.

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

Dziękuję. Czy klasa nadrzędna to klasa, która powinna otworzyć drugą? i dlaczego mam zmienić nazwę klasy w _Acceuil_start.py_? – Copernic

+0

@Mehdi Zaktualizuję odpowiedź! Czy to działa tak daleko? –

+0

Nie, daje mi ten błąd: _NameError: nazwa globalna "Acceuil" nie jest zdefiniowana dla: 'self.Acceuil = Acceuil (self)' – Copernic

0

Aby odwołać się do innego okna dialogowego z Start.py, należy poprzedzić je przez nazwę modułu, który w tym przypadku jest Acceuil_start. Jako takie, jest OK, jeśli w każdym module występują zduplikowane nazwy funkcji.Tak, to masz:

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

Jednakże, jeśli chcesz je uruchomić z tego samego procesu, należy pamiętać, że nie można mieć dwa app obiektów. Prawdopodobnie chcesz zbudować Acceuil_start.py, aby działał jak dialog, a nie okno główne. Jeśli są to dwa oddzielne główne okna, łatwiej będzie po prostu wywołać inny interpreter języka Python z parametrem Acceuil_start.py.

+0

Dziękuję. daje mi atrybut AttributeError: "Acceuil" nie ma atrybutu "exec_" – Copernic