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

Dienstag 3. Juli 2018, 12:44

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: 2270
Registriert: Samstag 2. Juni 2018, 10:21

Dienstag 3. Juli 2018, 13:02

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.
»I'm not going to ride on a magic carpet!« he hissed.
»I'm afraid of grounds!«
»You mean heights,« said Conina. »And stop being silly.«
»I know what I mean! It's the grounds that kill you!« — Terry Pratchett, Sourcery
BurgunderBraten
User
Beiträge: 7
Registriert: Dienstag 3. Juli 2018, 10:28

Dienstag 3. Juli 2018, 13:11

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: 2270
Registriert: Samstag 2. Juni 2018, 10:21

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.
»I'm not going to ride on a magic carpet!« he hissed.
»I'm afraid of grounds!«
»You mean heights,« said Conina. »And stop being silly.«
»I know what I mean! It's the grounds that kill you!« — Terry Pratchett, Sourcery
Atalanttore
User
Beiträge: 243
Registriert: Freitag 6. August 2010, 17:03

Samstag 24. November 2018, 22: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: 2270
Registriert: Samstag 2. Juni 2018, 10:21

Samstag 24. November 2018, 22:24

@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.
»I'm not going to ride on a magic carpet!« he hissed.
»I'm afraid of grounds!«
»You mean heights,« said Conina. »And stop being silly.«
»I know what I mean! It's the grounds that kill you!« — Terry Pratchett, Sourcery
Atalanttore
User
Beiträge: 243
Registriert: Freitag 6. August 2010, 17:03

Sonntag 25. November 2018, 20:11

@__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: 4539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Sonntag 25. November 2018, 20:15

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: 243
Registriert: Freitag 6. August 2010, 17:03

Sonntag 25. November 2018, 20:20

@__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: 4539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Sonntag 25. November 2018, 20:42

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: 2270
Registriert: Samstag 2. Juni 2018, 10:21

Sonntag 25. November 2018, 20:49

@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.
»I'm not going to ride on a magic carpet!« he hissed.
»I'm afraid of grounds!«
»You mean heights,« said Conina. »And stop being silly.«
»I know what I mean! It's the grounds that kill you!« — Terry Pratchett, Sourcery
Atalanttore
User
Beiträge: 243
Registriert: Freitag 6. August 2010, 17:03

Sonntag 25. November 2018, 21:40

@__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

Mittwoch 30. Januar 2019, 14:00

__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: 2270
Registriert: Samstag 2. Juni 2018, 10:21

Freitag 1. Februar 2019, 05:27

@BurgunderBraten: Warum hast Du Problem denn in Anführungszeichen gesetzt? Was ist denn das *konkrete* Problem?
»I'm not going to ride on a magic carpet!« he hissed.
»I'm afraid of grounds!«
»You mean heights,« said Conina. »And stop being silly.«
»I know what I mean! It's the grounds that kill you!« — Terry Pratchett, Sourcery
BurgunderBraten
User
Beiträge: 7
Registriert: Dienstag 3. Juli 2018, 10:28

Sonntag 10. Februar 2019, 09:16

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.
Antworten