Fenstergröße an Größe des Notebook-Panel anpassen

Plattformunabhängige GUIs mit wxWidgets.
Antworten
zarathustra
User
Beiträge: 59
Registriert: Samstag 17. April 2010, 23:02

Guten Morgen,

ich habe mit dem wxFormbuilder ein Fenster erstellt, welches ein Notebook enthält. Das Notebook wiederum besteht aus drei Panel. Die Panel wiederum sind unterschiedlich mit Textboxen, Labels, Schaltflächen, Spinnern etc. bestückt, sodass hier sehr unterschiedlich viel Platz bzw. Fenstergröße benötigt wird. Ein Panel z.B. 66 Textboxen und Anderes, ein anderes Panel nur 11 Textboxen. Für das größte Panel wird eine Größe von rund 1200 x 570 benötigt, die anderen Beiden sind entsprechend kleiner.

Da ich mich bei meinem Projekt auch mit Sizern beschäftigt habe enthalten Fenster, Notebook und Panel unterscheidliche Sizertypen. Auf dem Fenster befindet sich ein BoxSizer und eine Statusbar. In den BoxSizer habe ich das Notebook abgelegt.
Innerhalb des Notebooks wurden 3 Panel erstellt. Auf diesen Panels befinden sich, Panel1: Ein FlexGridSizer; auf den Panel 2 und 3 je ein GridBagSizer.

Mit dem GridBagSizer kam ich eigentlich am intuitivsten zurecht, weil der sich von der Vorstellung so ähnlich verhält wie Excel-Zellen. Also grob gesprochen. Man kann über Zeilen und Spalten positionieren und ggf. auch mal Zeilen oder Spalten zusammenfassen (wie Zellen verbinden in Excel) um z.B. eine Schaltfläche mittig unter zwei Textboxen zu positionieren. Aber das nur am Rand. Ich möchste dem gneigten Leser darstellen, dass ich mich schon daran versucht habe, mich mit Sizern auseienander zu setzen.

Wie bekomme ich es hin, dass sich die Fenstergröße an der Größe des jeweiligen Notebook-Panel orientiert? Momentan ist es so, dass sich das "Hauptfenster" der GUI am größten Panel orientiert und wenn man die Panel wechselt auf den anderen viel freie Fläche ist, die unnötigt Fensterfläche benötigt und einfach nur im Weg ist. Natürlich kann ich das Fenster an der Ecke anpacken und zusammenschieben, aber das ist auch jedesmal lästig. Ich hätte gerne, dass sich daß das Fenster nur immer so groß ist wie das aktuell aktive Notebook-Panel. Wie stelle ich das ein?

Vielen Dank für Hilfe
__deets__
User
Beiträge: 14480
Registriert: Mittwoch 14. Oktober 2015, 14:29

Persönlich halte ich das für eine furchtbare Idee. Ich kenne nicht ein Programm, das so ein Vorgehen zeitigt. Denn die durch sowas entstehende visuelle Unruhe, gepaart mit den sprichwörtlichen Randfällen, machen das ganze zu einem absoluten no-go.

Und technisch betrachtet stellt es auch durchaus eine Herausforderung dar, weil die constraint solver in Layoutern sich ja an irgendwas festhalten müssen. Allgemein lösbar wird das Problem also nicht sein.

Wenn man es denn nun unbedingt umsetzten will, dann wäre die Lösung denke ich nur so zu erreichen, dass man die kleinen Inhalte in einen Frame verpackt, umgeben von Spacern (so heissen die in Qt), die den Frame so klein wie möglich schieben. Und dessen Größe liest man dann aus, und verkleinert das Fenster. Ggf muss man dabei mit Timern arbeiten, weil das Layout System sich erstmal zurecht ruckeln muss, bis stabile Zustände ausgelesen werden können.

Anders gesagt: da muss viel experimentiert werden, die Lösung wird ein Würgaround, weil sie gegen fundamentale Annahmen arbeitet, und niemand hier hat das in der Schublade liegen.
Benutzeravatar
__blackjack__
User
Beiträge: 12984
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@zarathustra: Du willst da anscheinend genau das Gegenteil von dem erreichen wofür Notebook-Widgets ja eigentlich gedacht sind, das das Fenster eben *nicht* die Grösse ändert, wenn man den angezeigten Inhalt ändert, sondern immer den Platz für den grössten möglichen Inhalt einnimmt, damit die Fenstergrösse konstant ist und den Nutzer nicht in den Wahnsinn treibt.

Zusätzlich zum explizit gegen den Strom schwimmen kommt noch hinzu, dass man das auf allen Plattformen wo das dann laufen soll, ordentlich testen muss, denn wxWidgets setzt ja möglichst viel auf die nativen Elemente der jeweiligen Plattform und die bieten nicht alle die gleiche Funktionalität und verhalten sich eventuell auch etwas unterschiedlich.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
zarathustra
User
Beiträge: 59
Registriert: Samstag 17. April 2010, 23:02

Guten Abend.

hhmm, dann etwas zum Hintergrund zu meiner Anwendung, denn ich verstehe nicht weshalb mein Anliegen eine so "furchtbare Idee" ist. Es handelt sich um ein Makro für DesignCAD, dessen COM-Schnittstelle ich endlich einigermaßen verstanden habe mit Python über "comtypes" anzusprechen. Das allgemein gepriesene "win32com" funktionierte nicht richtig: ich kam an die Layer nicht heran. Aber das auch nur am Rande.

Weshalb es nach meinem Dafürhalten Sinn macht die Fenstergröße an an die jeweilige Notbook-Panel-Größe anzupassen ist schlicht der, dass das zu große Fenster viel Zeichnungsfläche verdeckt. Dem Fenster habe ich die Eigenschaft "wx_STAY_ON_TOP" verpasst. Damit es immer oben ist, weil Messungen aus der Skizze in Textboxen übertragen werden. Aber gleichzeitig besteht der Bedarf nach minimaler Fenstergröße um es so wenig wie möglich für die Messungen hin und her schieben zu müssen.
Es kann natürlich sein, dass ich einfach nur bekloppt bin, weil ich dieses Anforderungsprofil an meine GUI habe. Das schließe ich nicht aus.

Eine mögliche Alternative wäre drei "Frames" zu nehmen und mit Buttons versehen, die einen anderen Frame öffnen und der gerade in Verwendung befindliche geschlossen wird.

Ich dachte gerade die Flexibilität und Anpassungsfähigkeit von Sizern sei der große Vorteil von wxPython oder Qt, dass gerade sowas möglich ist. Ich progge sonst etwas Lazarus. Die GUI arbeitet dort mit "Anchors", deren Verhalten mich auch zur Weißglut treiben. Ich dachte GUI-Layout-Management sei mit Sizern optimal. Für jedes Betriebssystem anpassungsfähig etc. etc.

Da DesignCAD nur für Windows ist (und es COM ja auch nur für Windows gibt) erübrigen sich andere Plattformen.

Viele Grüße

Zarathustra
__deets__
User
Beiträge: 14480
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du verwechselst hier Dinge: sizer und co sind super für adaptive Layouts, und darum ein guter Weg.

Davon aber unberührt ist aber Fenster nicht wild rumspringen zu lassen. Sondern die werden üblicherweise nur manuell positioniert.

Nun ist es ohne Screenshots oder Skizzen schwer zu verstehen, was du da machst. Aber es klingt ein bisschen so, als ob das eigentlich eine Erweiterung in Art einer Palette sein will. Das ist natürlich ein etwas anders gelagerter Fall. Aber gut wird das auch nie, weil auch die ja unterhalb eines Anwendungsfensters hängen. Nur kontrollierst du das nicht.

Selbst wenn diese resizen also angebracht wäre - es ist ein Spezialfall, den die Frameworks eben so nicht unterstützen. Du musst also Hand anlegen, und das Fenster selbst verändern. Daran änder kein sizer der Welt was.
Benutzeravatar
Whitie
User
Beiträge: 216
Registriert: Sonntag 4. Juni 2006, 12:39
Wohnort: Schulzendorf

zarathustra hat geschrieben: Mittwoch 30. März 2022, 21:35 ...
Weshalb es nach meinem Dafürhalten Sinn macht die Fenstergröße an an die jeweilige Notbook-Panel-Größe anzupassen ist schlicht der, dass das zu große Fenster viel Zeichnungsfläche verdeckt. Dem Fenster habe ich die Eigenschaft "wx_STAY_ON_TOP" verpasst. Damit es immer oben ist, weil Messungen aus der Skizze in Textboxen übertragen werden. Aber gleichzeitig besteht der Bedarf nach minimaler Fenstergröße um es so wenig wie möglich für die Messungen hin und her schieben zu müssen.
...
Diese Anforderungen gibt es durchaus häufiger. Der sinnvollste Ansatz wäre hier ein weiterer Monitor, auf dem deine Anwendung läuft.

Viele Grüße
Whitie
zarathustra
User
Beiträge: 59
Registriert: Samstag 17. April 2010, 23:02

Ich hab's jetzt mal mit SetSize gelöst. Das funktioniert für mich. Wenn das Makro fertig ist lasse ich es einen Kollegen ausprobieren ob es auch bei ihm so reagiert wie bei mir.
Antworten