2017-07-19 1 views
0

könnte dies eine grundlegende Frage, aber ich habe nicht eine funktionierende Lösung noch nicht gefunden:Python: QT5 umfassen ui.py in Haupt Python-Skript

Dies ist mein erster Python UI Script ... Ich habe die Idee von der Benutzeroberfläche in einer Datei ohne Funktionalität setzen und setzten alle den eigentlichen Code und Algorithmen in einer anderen Datei, aber ich weiß nicht, ob dies eine gute Praxis ist oder nicht und wie diese Arbeit zu machen.

Ich habe eine Benutzeroberfläche mit GTDesigner erstellt und diese in MainWindowPy.py mit pyuic5 konvertiert.

Das gab mir:

class Ui_MainWindow(object): 
    def setupUi(self, MainWindow): 
     [...] 
    def retranslateUi(self, MainWindow): 
     [...] 

if __name__ == "__main__": 
    import sys 
    app = QtWidgets.QApplication(sys.argv) 
    MainWindow = QtWidgets.QMainWindow() 
    ui = Ui_MainWindow() 
    ui.setupUi(MainWindow) 
    MainWindow.show() 
    sys.exit(app.exec_()) 

Jetzt möchte ich diesen MainWindowPy.py unberührt lassen, weil die Benutzeroberfläche im weiteren delevopment ändern können.

Wie kann ich Link und diese Datei in meinem MainApplication.py Skript ausführen und wie kann ich auf UI-Elemente wie Buttons?

Ich habe versucht, den gesamten UI-Code in eine Funktion zu verpacken und dann als Modul in MainApplication.py importiert und die Funktion über dieses Modul aufgerufen. Es funktionierte, aber das ist nicht „unberührt“.

Ich weiß über subprocess.Popen(), aber vielleicht gibt es einen besseren Weg?

Antwort

2

Der in diesem Fall erzeugte Code ist eine mixin Klasse. Um es in einer anderen Datei verwenden Sie einfach importieren und erstellen Sie eine neue Klasse mit zwei Basisklassen, eine, die die Qt-Klasse ist, dass Sie es wollen und die zweite, die die mixin Klasse von Ihrem uic ist generierte Datei. Im init Ihre neuen Klasse müssen Sie die init-Methode der primären Basisklasse und die setupUi Methode der mixin Klasse laufen:

from MainWindowPy import Ui_MainWindow 
from PyQt5 import QtWidgets 

class myMainWindow(QtWidgets.QMainWindow, Ui_MainWindow): 
    def __init__(self, parent=None): 
     super(myMainWindow, self).__init__(parent) # call init of QMainWindow, or QWidget or whatever) 
     self.setupUi(self) # call the function that actually does all the stuff you set up in QtDesigner 

jetzt, es zu benutzen, initiieren Sie Ihre eigene Klasse, die Sie gemacht

if __name__ == "__main__": 
    import sys 
    app = QtWidgets.QApplication(sys.argv) 
    MainWindow = myMainWindow() 
    MainWindow.show() 
    sys.exit(app.exec_())