Ich befasse mich noch nicht sehr lange mit Python. Für die Programm-Oberfläche benutze ich auch wegen des Designers sehr gerne Qt bzw. PyQt.
Jetzt möchte ich ein Projekt umsetzen, für das ich ein sehr umfangreiches Formular habe, mit vielen Funktionen (Mitgliederverwaltung eines Vereins).
Das Problem: Der Programmcode wird sehr schnell umfangreich und auch unübersichtlich.
Meine Frage: Kann ich das Programm z.B. wie folgt aufteilen? (Ich hab ein bisschen was zu Model-View-Controller-Konzepten gelesen

Programmstart über main.py:
Code: Alles auswählen
import sys
from PyQt5.QtWidgets import QApplication
from controller.controller import Controller
class Main(QApplication):
def __init__(self, *args):
super().__init__(*args)
self.controller=Controller()
if __name__ == "__main__":
app = Main(sys.argv)
sys.exit(app.exec_())
Code: Alles auswählen
from views.view import View
class Controller():
"""
- startet die View mit dem Formular und das Model
- nimmt die Signale des Formulars entgegen
- steuert die Funktionen des Formulars
"""
def __init__(self, *args, **kwargs):
super().__init__()
# Formular anzeigen Controller-Objekt (self) + Template übergeben
self.view = View(self, "template.ui")
# Das Hauptformular öffnen
self.view.show()
# -------------------------------------------------------------------------
# Slots
# -------------------------------------------------------------------------
def textaendernc(self):
self.view.lineEdit.setText("Button gedrückt!")
Code: Alles auswählen
from PyQt5.QtWidgets import QMainWindow, QWidget
from PyQt5.uic import loadUi
class View(QMainWindow):
"""
Öffnet das Formular template.ui und stellt Schnittstellen zum Zugriff auf die
Formularfelder bereit
"""
def __init__(self, controller, template):
super().__init__()
# Verweis auf den Controller
self.controller=controller
# Formular erstellen und anzeigen
self.createLayout(template)
# Signale verknüpfen
self.createConnects()
def createLayout(self, template):
#Mit dem QT-Designer erstelltes Formular (.ui-File) laden
formpfad="views/template/" + template
self.ui=loadUi(formpfad, self)
def createConnects(self):
"""
Connects des Formulars erstellen
"""
self.ui.pushButton.clicked.connect(self.textaendern)
# ---------------------------------------------------------
# Slots
# ---------------------------------------------------------
def textaendern(self):
"""
Text in der Lineedit ändern - über den Controller
"""
self.controller.textaendernc()
Der Code funktioniert so zwar, aber ich bin mir dennoch nicht sicher, ob die Anbindung des View-Objekts (oder künftig der anderen Controller bzw. des Models) so gemacht werden kann, nämlich indem ich den Controller sich selbst übergeben lasse (hier im Aufruf der View per self -> "self.view = View(self, "template.ui")" ).