2013-02-07 13 views
6

QT Designer'ı kullanarak PyQT'de birçok GUI arabirimi oluşturdum, ancak şimdi bir arabirimi başka bir pencereden açmaya çalışıyorum ve nasıl yapılacağını bilmiyorum .. Start.py GUI arabirimi çalıştırmak dosyasıdır Authentification_1 ve Acceuil_start.py, şimdi Start.pyöğle Acceuil_start istediğiniz GUI arayüzüne Acceuil_2.py çalıştırmak dosyasıdır .py. Bunun hakkında bir fikrin var mı? Teşekkür ederim. İşte benim kod:Başka bir dosyadan bir GUI dosyası açın 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_()) 
, onlar farklı bir ad değil, genel birine sahip böylece GUI sınıfları adlandırmak için gereken

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

cevap

4

İlk olarak, onları ayrı olabilir böylece.

Bunu neden yapmanız gerekir? Eh - basitçe, çünkü mantıklı - eğer her sınıf farklı bir iletişim tipini temsil ediyorsa, bu farklı bir tiptir - ve farklı olarak adlandırılmalıdır. Bazı isimler/olabilir: QMessageBox, AboutBox, AddUserDialog, vb.

Acceuil_start.py'de (başka bir modülde de sınıfı yeniden adlandırmalısınız). Eğer pencere oluşturmak istediğinizde ana sınıfında

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

, sen (ama her durumda çalışmalıdır) yakın:

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

ebeveyn sorunu hakkında: Widget/pencere ise ebeveyn olmak yaratıcısı nesneyi ayarlayarak, başka widget'ı oluşturarak her zaman (biraz ayrı tekil durumlarda itibaren) iyi bir fikir olduğunu ve neden görmek this okumalısınız böylece:

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.

Düzenleme - Minimum Çalışma Örneği

Size ne anlatmaya çalıştığımı görmek için basit bir örnek oluşturdum. İki sınıfınız var: MainWindow ve ChildWindow. Her sınıf ayrı bir QApplication nesnesi oluşturarak başka bir sınıf olmadan çalışabilir. Ancak, ChildWindow'u MainWindow'da içe aktarırsanız, 5 saniye içinde tetiklenecek tekil çekim zamanlayıcısına bağlı yuvada ChildWindow oluşturacaksınız.

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

Teşekkür ederiz. Ebeveyn sınıfı, diğerini açması gereken sınıf mı? ve neden _Acceuil_start.py_? içindeki sınıfın adını değiştirmeliyim? – Copernic

+0

@Mehdi Cevabımı güncelleyeceğim! Bu şimdiye kadar çalışıyor mu? –

+0

Hayır, bana bu hatayı veriyor: _NameError: global adı 'Acceuil' bunun için tanımlı değil_: 'self.Acceuil = Acceuil (self)' – Copernic

0

Start.py diğer iletişim başvurmak için, bu durumda olan modül adına göre yazmanız gerektiğine Acceuil_start. Bu nedenle, her modülde yinelenen işlev adları varsa Tamam olur.Yani, olurdu:

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

Ancak, bu, aynı süreçten çalıştırmak iki app nesneleri olamaz akılda tutmak istiyorsanız. Muhtemelen Acceuil_start.py'yi bir ana pencereden ziyade bir diyalog gibi davranacak şekilde yapılandırmak isteyebilirsiniz. Bunlar iki ayrı ana pencere ise, Acceuil_start.py ile başka bir Python yorumlayıcısını parametre olarak çağırmayı daha kolay bulabilirsiniz.

+0

Teşekkür ederim. bana 'AttributeError' verir: 'Acceuil' nesnesinin 'exec_' özelliği yoktur. – Copernic

İlgili konular