Benutzeroberfläche mit "mehreren GUIs"

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Sirius3
User
Beiträge: 17710
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: 13003
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: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Also willst Du so etwas wie ein Tabbed-View.
Beispiel: https://pythonspot.com/pyqt5-tabs/
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@BurgunderBraten: Wo hast Du denn dabei jetzt konkret ein Problem bei der Umsetzung? Wie sieht Deine GUI und Dein Code bisher aus? Welche Gedanken hast Du Dir über die Layouts gemacht? Welche Widgets für die wechselnden Seiten in Frage kommen habe ich ja nun schon *zweimal* geschrieben, das werde ich jetzt nicht noch einmal kopieren. Eines davon ist für das jetzt beschriebene, konkretere Problem super geeignet.

Ich sehe hier nichts ”dynamisches” und nichts was irgendwie schwierig oder exotisch wäre, wenn man sich halt mal die Grundlagen von Python und Qt drauf schafft. Die beschriebene GUI lässt sich komplett mit dem Designer zusammen klicken, aber auch leicht per Code erstellen, denn so viele Teile sind das ja letztlich nicht. 11 wenn ich mich nicht verzählt habe. Davon 4 Layouts. Im Code verbindet man dann noch die passenden Signale der Buttons mit ein bisschen Code der die jeweilige Seite aktiviert/auswählt, und das war es dann auch schon. Python und objektorientierte Programmierung braucht man natürlich als Voraussetzung. `functools.partial()` könnte nützlich sein.

Ich zeige das jetzt, auch wenn es einfach ist, nicht konkreter, weil Du bisher Null Eigenleistung gezeigt hast zu einer Lösung zu kommen.
“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

__blackjack__ hat geschrieben: Montag 11. Februar 2019, 10:28 @BurgunderBraten: Wo hast Du denn dabei jetzt konkret ein Problem bei der Umsetzung? Wie sieht Deine GUI und Dein Code bisher aus? Welche Gedanken hast Du Dir über die Layouts gemacht? Welche Widgets für die wechselnden Seiten in Frage kommen habe ich ja nun schon *zweimal* geschrieben, das werde ich jetzt nicht noch einmal kopieren. Eines davon ist für das jetzt beschriebene, konkretere Problem super geeignet.

Ich sehe hier nichts ”dynamisches” und nichts was irgendwie schwierig oder exotisch wäre, wenn man sich halt mal die Grundlagen von Python und Qt drauf schafft. Die beschriebene GUI lässt sich komplett mit dem Designer zusammen klicken, aber auch leicht per Code erstellen, denn so viele Teile sind das ja letztlich nicht. 11 wenn ich mich nicht verzählt habe. Davon 4 Layouts. Im Code verbindet man dann noch die passenden Signale der Buttons mit ein bisschen Code der die jeweilige Seite aktiviert/auswählt, und das war es dann auch schon. Python und objektorientierte Programmierung braucht man natürlich als Voraussetzung. `functools.partial()` könnte nützlich sein.

Ich zeige das jetzt, auch wenn es einfach ist, nicht konkreter, weil Du bisher Null Eigenleistung gezeigt hast zu einer Lösung zu kommen.
Also das "Problem" ist ja kein Problem an sich, sondern ich bin am überlegen mit was ich in Zukunft weiterprogrammiere. Ich hab meine "Anwendung" bis dato in PHP, HTML etc. als "Web-Anwendung". Ich bin allerdings kein wirklicher Freund von Browser basierten "Anwendungen", sondern mehr ein Freund von "klassischen" Desktop-Anwendungen.
Bevor ich mich mit PHP etc. beschäftigt hatte, hatte ich mir das Buch "Python 3 - Das umfassende Handbuch" von Rheinwerk-Verlag gekauft. Dort ist natürlich auch Qt5 etc. beschrieben, was auch soweit nachvollziehbar war, jedoch eben nur mit den üblichen Standardbeispielen mit einer statischen Seite. Jetzt möchte ich eigentlich den "Aufwand" abschätzen wenn die GUI eben "umfangreicher" wird. In den Büchern hört es da immer auf, und dann steht man da und weiß nicht weiter. Deshalb würde mich der einfache Beispielcode wie oben erwähnt ja schon mal zum reinschnuppern helfen. Ich hab selber da noch keinen Ansatz und keinen Code.
Da die Anwendung nur für mich Privat ist bleib ich halt beim Web-Design falls das mit Python zu kompliziert ist, reicht mir letztendlich auch. Aber eigentlich war mir Python beim anfänglichen lernen ja sympathisch.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Benutz ein StackedWidget, und lass deine drei Buttons entscheiden, welchen Index du setzt.

https://doc.qt.io/qt-5/qstackedwidget.html#details

Fang an, und wenn du fragen hast, stell die hier.

Ich bin persoenlich der Meinung, dass der Browser das leistungsfaehigere Tool ist, wie die immer zahlreicher werdenden Electron-Anwendungen zeigen. Natuerlich nicht mit PHP im Backend, und "fetten" JS-Frontends. Sehen besser aus, koennen mehr, sind cooler zu stylen (auch arbeitsteilig, ganz anders als Qt). YMMV.
BurgunderBraten
User
Beiträge: 7
Registriert: Dienstag 3. Juli 2018, 10:28

__deets__ hat geschrieben: Montag 11. Februar 2019, 12:46 Benutz ein StackedWidget, und lass deine drei Buttons entscheiden, welchen Index du setzt.

https://doc.qt.io/qt-5/qstackedwidget.html#details

Fang an, und wenn du fragen hast, stell die hier.

Ich bin persoenlich der Meinung, dass der Browser das leistungsfaehigere Tool ist, wie die immer zahlreicher werdenden Electron-Anwendungen zeigen. Natuerlich nicht mit PHP im Backend, und "fetten" JS-Frontends. Sehen besser aus, koennen mehr, sind cooler zu stylen (auch arbeitsteilig, ganz anders als Qt). YMMV.
Vielen Dank, vor allem auch für deine persönliche Meinung bezüglich dem Browser!
Ich werde mich mal mit den StackedWidget ein bisschen näher befassen.
habanero
User
Beiträge: 7
Registriert: Donnerstag 15. November 2018, 04:02

Habe hier nochmal ein sehr einfaches Beispiel für das QStackedWidget mit Python-Code gefunden: https://www.tutorialspoint.com/pyqt/pyq ... widget.htm

Mit freunldichen Grüßen
habanero
Atalanttore
User
Beiträge: 407
Registriert: Freitag 6. August 2010, 17:03

__blackjack__ hat geschrieben: Sonntag 10. Februar 2019, 12:23 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.
Da es im Qt Designer kein eigenes Platzhalter-Widget gibt, vermute ich, dass man als Platzhalter genau das Widget nehmen muss, das man im Programm dynamisch mit Inhalt füllen möchte. Stimmt das?

Vielen Widgets kann man im Qt Designer auch einen Text zuweisen. Lässt man das Feld bei einem Platzhalter einfach leer oder gibt es da eine Konvention? Ein QLabel ohne Text in einem Formular in Qt Designer wäre allerdings ziemlich unsichtbar.

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

Nein, das stimmt nicht. Du kannst jedes widget nehmen, und du solltest einen Namen vergeben, der es dir dann ermoeglicht, das widget einfach zu finden. Dann entfernst du es aus dem Elternteil, und ersetzt es durch dein selbst angelegtes.

https://doc.qt.io/qt-5/qlayout.html#replaceWidget

Und du darfst dem Widget im Designer nach Herzenslust etwas hinzufuegen. Es verschwindet ja eh. Eine Konvention gibt es da nicht.
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wobei sich ein QWidget oder ein QFrame schon anbietet wenn man es mit Inhalt füllen möchte, statt es komplett durch etwas anderes zu ersetzen. Und QWidget auch wenn man es komplett ersetzt, einfach weil es das ”einfachste” Widget ist.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten