Benutzeroberfläche mit "mehreren GUIs"

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
BurgunderBraten
User
Beiträge: 7
Registriert: Dienstag 3. Juli 2018, 10:28

Hallo an die Python-Gemeinde,
ich bin gerade am reinschnüffeln in Python und habe mir ein entsprechendes Anfängerbuch gekauft. Ich möchte mir ein Programm mit einer entsprechenden GUI erstellen und habe mich schon ein wenig mit dem Kapitel über QT/Designer beschäftigt.

Es wird ja in den Büchern immer schön vorgestellt wie ich eine GUI (bzw. Fenster) mit ein paar Buttons, TextBoxen etc. machen kann. Das mit der EINEN Seite bzw. Fenster in dem die Buttons etc. dargestellt werden ist relativ durchschaubar für mich. Jedoch besteht ein Programm ja in den seltensten Fällen aus nur einer Seite, oder einer Ansicht. Also in der Regel habe ich ja irgendwo ein Menü (z.B. links am Bildschirm bzw. am Fenster der Anwendung) und je nachdem was ich anklicke wird der Inhalt in einem anderen Bereich des Fensters dargestellt. Wie wird denn so was realisiert? Hat das was mit dem Modell-View-Controller zu tun oder bin ich da völlig falsch?

Ich hoffe ich konnte es einigermaßen erklären was ich meine.
Da gerade Fussball-WM ist vielleicht folgendes Beispiel: Hauptfenster mit Auswahlmenüs (z.B. Spieltag, Tabelle, ...). Wird Spieltage angeklickt werden eben zig Labels mit den Mannschaften und Texteingabefelder für die Ergebnisse dargestellt. Nach drücken auf OK werden diese z.B. gespeichert und dann wird die Tabelle dargestellt. Werden dann die Labels und Eingabefelder aus der Ergebniseingabe einfach gelöscht und neue dargestellt, oder wird ein komplett neues Fenster geöffnet oder oder......
Oh je, ich glaub das war jetzt auch nicht verständlicher.... :-(

Also mir geht es nicht so sehr um die Details sondern um die generelle Möglichkeiten bzw. die Vorgehensweise mit der man so was realisieren kann, speziell natürlich auch im Zusammenhang mit dem Designer.

Grüße
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Dynamisch aufgebaute Teile der GUI macht man gar nicht mit dem Designer. Wie auch, da weiss man noch gar nicht wie viele und welche Mannschaften es gibt. Das kann man ja erst per Programm machen.

So generell kann man im Designer für Bereiche wo später dynamisch etwas passieren soll einfach einen Frame einbauen, dem einen Namen geben, und über den Namen dann im Programm weitere Anzeigeelemente dynamisch zu dem Frame hinzufügen oder dann auch wieder löschen.

Allerdings könnte man für Tabellendaten auch einfach die entsprechenden Widgets für Listen, Tabellen, oder Bäume im Designer einbauen und dann im Programm mit einem entsprechenden Model ausstatten.

Für Flächen wo man zwischen verschiedenen Inhalten wechseln können soll, sind auch Tool Box, das Tab Widget, und das Stacked Widget interessant.

Man muss auch nicht die gesamte GUI in einer *.ui-Datei definieren, man kann auch Teile eines Fensters in eigenen *.ui-Dateien definieren und im Progamm dann zusammensetzen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
BurgunderBraten
User
Beiträge: 7
Registriert: Dienstag 3. Juli 2018, 10:28

Ok, Danke blackjack, da muss ich mich dann mal reinarbeiten wenn ich soweit bin. Kennt jemand einen Link zu Beispielcode zu diesem Thema zum Lernen?
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Die Qt-Dokumentation hat viele Beispiele. Zwar in C++, aber das muss man dafür nur so weit lesen können als das man das auf Python übertragen kann. Mit der Dokumentation wird man sowieso arbeiten müssen. Und die ist ziemlich gut.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

__blackjack__ hat geschrieben: Dienstag 3. Juli 2018, 13:02 Man muss auch nicht die gesamte GUI in einer *.ui-Datei definieren, man kann auch Teile eines Fensters in eigenen *.ui-Dateien definieren und im Progamm dann zusammensetzen.
Davon habe ich noch nichts gelesen. Hast du dazu eine kurze Erklärung oder einen Link mit einer Beschreibung wie so etwas geht?

Gruß
Atalanttore
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Atalanttore: Du kannst Dir aus *.ui-Dateien zur Laufzeit das Widget geben lassen und das wie alle anderen Widgets auch im Programm dann in andere GUIs einbauen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

@__blackjack__: Geht das nur mit einem Widget oder kann man auch ganze Layouts mit jeweils mehreren Widgets aus *.ui-Dateien zur Laufzeit in ein Fenster laden?

Gruß
Atalanttore
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du kannst natuerlich beliebige widgets wieder als Kinder unter einen Frame oder was auch immer stoepseln. Nur ist das ja etwas fragwuerdig, wenn du dann ploetzlich wieder von Hand layout-Code schreibst.
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

@__deets__: Ich frage mich schon die ganze Zeit nach dem Sinn warum man Widgets bzw. Layouts für ein Fenster auf mehrere .ui-Dateien verteilen soll, damit man sie nachher per Code wieder zusammenfügen kann/muss.

Gruß
Atalanttore
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das kommt darauf an. Du kannst zb ein Anwendungsgeundgerüst im Designer aufbauen, und davon teile dann nach Bedarf austauschen. Nicht jede Anwendung ist so simpel, das sie mit allen möglichen UI-Elementen starten kann.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Atalanttore: Modularität und Wiederverwendbarkeit. Genau wie bei Modulen in Python. Zum Beispiel könnte man eine Anwendung haben, die aus mehreren Komponenten besteht und deren Einstellungen trotzdem in einem Fenster darstellen. Da entwirft man dann die GUI für die Einstellungen insgesamt, und für jede Komponente jeweils als *.ui-Datei und baut die dann zur Laufzeit zusammen. Man kann dann einfach Komponenten entfernen oder hinzufügen ohne an den anderen GUI-Teilen etwas ändern zu müssen. Plugins wären ebenfalls ein Beispiel.

Und die ursprüngliche Frage dieses Themas ist ja auch ein Beispiel. Es gibt halt Sachen die sind statisch noch nicht bekannt, also kann man die im Designer auch nicht fest vorgeben. Beispielsweise ein Spiel mit Spielfeldern wobei der Benutzer wählen kann aus wie vielen Feldern eine Spielrunde besteht. Diese Spielfelder würde man dann im Programm dynamisch erstellen. Aber den statischen Teil drumherum kann man im Designer bauen. Mit einem Frame als Platzhalter wo dann die Spielfelder rein kommen. Ein einzelnes Spielfeld könnte aber wiederum so komplex sein (Grafik, verschiedene Anzeigen, Prozentbalken für Zustände, usw.) das man die vielleicht auch wieder im Designer entwerfen möchte. Und dann mehrere davon dynamisch erstellen und in den Frame einbauen. In dem Zusammenhang ist neben der `loadUi()`- auch die `loadUiType()`-Funktion aus dem `uic`-Modul interessant.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

@__deets__ & __blackjack__: Danke für die Erklärungen. Wie immer sehr interessant.

Gruß
Atalanttore
BurgunderBraten
User
Beiträge: 7
Registriert: Dienstag 3. Juli 2018, 10:28

__blackjack__ hat geschrieben: Dienstag 3. Juli 2018, 14:36 Die Qt-Dokumentation hat viele Beispiele. Zwar in C++, aber das muss man dafür nur so weit lesen können als das man das auf Python übertragen kann. Mit der Dokumentation wird man sowieso arbeiten müssen. Und die ist ziemlich gut.
Hallo zusammen,
jetzt muss ich mal meinen Thread von vor langer Zeit wieder aufmachen. Also nachdem ich mit mittlerweile mit PHP, CSS und JavaScript beschäftigt habe, komme ich nun auf Python zurück.
Also ich habe zu meinem "Problem" von damals immer noch keine Beispiele gefunden welche das sinnig erklären würden, so dass dies irgendwie nachvollziehbar sein könnte.
Schreiben denn alle in Python nur Konsolenanwendungen oder Programme mit einer starren GUI-Oberfläche? Das glaub ich eigentlich nicht, aber wieso finden sich dann keine Beispielprogramme im Netz?

Gruß
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@BurgunderBraten: Warum hast Du Problem denn in Anführungszeichen gesetzt? Was ist denn das *konkrete* Problem?
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
BurgunderBraten
User
Beiträge: 7
Registriert: Dienstag 3. Juli 2018, 10:28

Na dass eine GUI welche aus einer Seite besteht kein Problem ist, aber welche Applikation hat schon nur eine Seite? Und wie bekomme ich es in Python hin, dass ich mehrere "GUI-Seiten" habe mit unterschiedlichem Inhalt? So wie bei einer Web-Seite halt, da hab ich ja auch mehrere Seiten und nicht nur eine.
Ich habe noch nirgends Beispiele gefunden wo ich das nachvollziehen kann.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@BurgunderBraten: was ist denn das konkrete "Problem"? GUI-Programme können sehr unterschiedlich aussehen. Es gibt normalerweise verschiedene Fenster, die unterschiedliche Aufgaben haben, aber einen mehr oder weniger vorgegebenen Aufbau. Was willst Du nun "dynamisch" machen?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dann such doch mal durch github mit dem Stichwort pyqt5. Da finden man Tonnen an Code und Projekten. Wie zb

https://github.com/ninja-ide/ninja-ide

Die recht beliebte Spyder IDE: https://github.com/spyder-ide/spyder/tree/master/spyder

Persepolis download manager https://github.com/persepolisdm/persepolis

Und so weiter und so fort... https://github.com/search?o=desc&q=pyqt ... positories
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@BurgunderBraten: Wenn ich mich mal selbst aus der allerersten Antwort auf Deine Frage zitieren dürfte: „Für Flächen wo man zwischen verschiedenen Inhalten wechseln können soll, sind auch Tool Box, das Tab Widget, und das Stacked Widget interessant.“ Das sind die drei Widgets wenn man mehrere Seiten, so ähnlich wie bei Webseiten, in der GUI haben möchte. Da kämen dann noch das Stichwort Wizard dazu wenn man diesen typischen „wir leiten den Benutzer durch mehrere Schritte mit »Weiter«- und »Zurück«-Schaltflächen“. Eventuell könnte man noch einen MDI-Bereich dazu nehmen, wo man ja mehrere Unterfenster drin erstellen kann, aber auf jeden Fall auch einfach QWidget oder gar mehrere QMainWindow um einfach mehrere Fenster zu öffnen.

Für all diese Sachen sollte die Qt-Dokumentation eigentlich ausreichend sein. Ja, man muss ein bisschen C++ lesen lernen und erfassen wie das vom Python-Wrapper auf Python umgesetzt wird, um die Beispiele zu verstehen, aber das ist im Vergleich zum programmieren in C++ *wesentlich* einfacher.

Konkretere Antworten kann man schlecht geben solange Du kein konkreteres Problem formulierst. Ich sehe jedenfalls keines. Wenn man in Qt eine GUI mit Code erstellen kann, also 100% ”dynamisch” und eine GUI mit dem Designer erstellen kann, also 100% ”statisch”, dann hat man auch das nötige Wissen um eine GUI mit dem Designer zu erstellen wo man an bestimmten Stellen Platzhalter, also beispielsweise leere Widgets einsetzen, die man im Programm dann dynamisch mit Inhalt füllen kann. Kannst Du das beides? Also eine GUI mit und ohne Designer erstellen? Falls nicht, lerne das und komm dann mit konkreten Problemen wieder die man dann auch konkreter beantworten kann.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
BurgunderBraten
User
Beiträge: 7
Registriert: Dienstag 3. Juli 2018, 10:28

Sirius3 hat geschrieben: Sonntag 10. Februar 2019, 10:27 @BurgunderBraten: was ist denn das konkrete "Problem"? GUI-Programme können sehr unterschiedlich aussehen. Es gibt normalerweise verschiedene Fenster, die unterschiedliche Aufgaben haben, aber einen mehr oder weniger vorgegebenen Aufbau. Was willst Du nun "dynamisch" machen?
Das "Problem" soll eigentlich beispielsweise so aussehen wie bei einer Web-Seite oder eben bei jeder anderen Applikation:
Ein Applikationsfenster auf welchem am linken Bildschirmrand ein Menü mit verschiedenen Buttons/Flächen zum Anklicken ist, für die verschiedenen Menüpunkte. Der rechte Bildschirmbereich soll dann die Inhalte darstellen, je nach angeklicktem Menüpunkt.

Um ein einfaches Beispiel zu verwenden:
Im linken fixen Bildschirmbereich sind zwei Buttons, Button 1 und Button 2. Im rechten "dynamischen" Bildschirmbereich wird dann je nachdem welcher Button gedrückt wurde ein Inhalt dargestellt. Drücke ich z.B. Button 1 dann erscheint ein Label mit "Button eins gedrückt". Wird Button 2 gedrückt "verschwindet" Label 1 und es erscheint ein Textfeld mit dem Inhalt "Button 2 wurde gedrückt", usw....
Dafür hätte ich gerne ein Beispielcode, wie dies umgesetzt werden kann. Es muss nicht zwingend mit Qt realisiert werden, es geht mir generell mehr um das Prinzip.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Also willst Du so etwas wie ein Tabbed-View.
Beispiel: https://pythonspot.com/pyqt5-tabs/
Antworten