ich brauche mal wieder eure Hilfe. Ich möchte gerne mein erstes MATLAB GUI ohne GUIDE erstellen. Soweit ich das recherchiert habe, ist es bei Codeerstellung größerer GUIs übersichtlicher den GUIDE nicht zu verwenden. Außerdem fällt die zusätzlich *.fig Datei weg welche lediglich die Positionen der eingefügten Bedienelemente etc. enthält. Und da sehe ich schon ein möglicherweise etwas größeres Problem.
Bei einem GUI mit GUIDE kann ich die Bedienelemente sehr einfach an Ort und Stelle positionieren und diese wenn nötig (wenn man zB. merkt das mehrere Elemente aus Platzgründen anders angeordnet werden müssen) später ebenso einfach anders anordnen kann.
Erstellt man hingegen ein GUI ohne GUIDE muss man ja für jedes Bedienelement was man anlegt die Position separat angeben. Da fängt schon mal damit an welche Einheit dafür am besten geeignet ist. Ich habe derzeit die Einheit auf "normalized" gestellt. Damit hat man aber überhaupt kein Gespür dafür welche Werte man in etwa angeben muss um die Elemente an die gewollte Stelle und Größe zu bringen. Muss man im GUI mehrere Elemente platzieren, dann ist das recht mühsam und ist man erst mal fertig und man sieht, dass man wie oben schon erwähnt, mehrere Elemente aus welchen Gründen auch immer anders anordnen muss, dann muss man die Bedienelemente wieder Schritt für Schritt neu positionieren - ein Zeitaufwand der möglicherweise mit der richtigen Herangehensweise deutlich reduziert werden könnte.
Daher möchte ich euch bitte mir eure Vorgehensweise zu beschreiben wie man möglichst Effizient die Bedienelemente einer MATLAB GUI platzieren kann unter Berücksichtigung möglicher Neuanordnungen.
Wie geht ihr also vor beim GUI erstellen?
Ich finde Normalized Units eigentlich recht übersichtlich:
Das Objekt soll 5% der Fenstergröße von der linken unteren Ecke entfernt sein und die Hälfte der Fensterbreite haben und bis ganz oben gehen:
[0.05, 0.05, 0.5, 0.95]
Irgendwie logisch, oder?
Man kann GUIDE verwenden um zunächst mal ein FIG-File zu erstellen. Dieses FIG-File kann man dann mit LOAD einlesen, denn FIG Files haben das gleiche Format wie MAT-Files. In dem eingelesenen Struct findet man nun alle Positionen der UICONTROLs und kann sie in den Code kopieren und das Fein-Tuning beginnen.
Wenn man aber später ein neues Objekt einfügen muss, ist die erneute Übertragung der Daten umständlich.
Zitat:
Erstellt man hingegen ein GUI ohne GUIDE muss man ja für jedes Bedienelement was man anlegt die Position separat angeben. Da fängt schon mal damit an welche Einheit dafür am besten geeignet ist.
Die Teile, die beim Ändern der Fenster-Größe automatisch mitangepasst werden sollen, sind am besten in Normalized Units anzugeben, die mit unveränderlicher Größe sind in Pixels einfacher.
Das ist zwar eine gute Strategie, es führt aber unweigerlich zu den bekannten Problemen, wenn jemand ein ultra-hochauflösendes Display benutzt und die Buttons dann mikroskopisch klein werden!
Deshalb lese ich zunächst die ScreenPixelsPerInch aus, errechne daraus eine optisch sinnvolle Höhe der Buttons und speichere sie. In der ResizeFcn benutze ich sie dann um die Buttons zu positionieren. Danach bestimme ich den verbleibenden Platz für die Elemente, die dynamisch mit der Fenstergröße mitwachsen sollen.
Ich habe damit freie Hand das GUI frei nach meinen Wünschen und unabhängig von der Auflösung und Fenstergröße zu erstellen, es ist aber eine Menge Handarbeit dabei und das ist immer unpraktisch.
Im FileExchange gibt es einiges Tools um das ansatzweise zu automatisieren. Richtig vom Hocker gehauen hat mich aber bisher keines. Es lohnt sich trotzdem, sie sich anzuschauen, denn wenn eines die eigenen Bedürfnisse abdeckt, ist es allemal besser als händische Frickelei.
klingt als würdest du eine strukturierte Vorgehensweise beim Erstellen einer GUI haben. Könntest du vllt. ein paar Codeschnipsel posten welche du verwendest um die Positionierung der Buttons in der ResizeFcn vorzunehmen - ich glaube ich verstehe es noch nicht ganz.
Außerdem liest es sich so als würde das Erstellen einer GUI ohne GUIDE immer eine Menge Handarbeit mit sich bringen.
Würdest du aus persönlicher Sicht das Erstellen mit oder ohne GUIDE empfehlen?
"Description - This is a collection of GUIs meant to serve either to answer specific questions about writing GUIs or as a teaching tool to aid in learning how to write MATLAB GUIs without GUIDE. Many of these are inspired directly from the newsgroup."
also diesen Beitrag bei File-Exchange habe ich bis heute nicht gekannt. Danke dafür - den werde ich bei Gelegenheit mal Stück für Stück sichten. So mal grob überflogen habe ich das ein oder andere Interessante schon entdeckt.
Ich selbst benutzte GUIDE nur, wenn ich auf die Schnelle mal ein paar GUI-Elemente herum schieben möchte, um eine hübsche Anordnung zu finden. Den Rest mache ich immer per Code.
Es ist nun doppelt, die Position der GUI-Elemente im Hauptprogramm und in der ResizeFcn zu setzen. Deshalb erzeuge ich die Elemente zunächst nur (wobei die FIGURE noch auf 'Visible' = 'off' gesetzt ist) und rufe die ResizeFcn manuell auf. In manchen Matlab-Versionen wird die ResizeFcn auch automatisch nach dem Erstellen aufgerufen, darauf verlasse ich mich allerdings nicht.
Und genau so, wie hier die Button-Breite dynamisch gesetzt wird, kann man auch die Positionen anderer Elemente anpassen. So könnte man z.B. nach dem Zeichnen aller Buttons den Wert von "y" verwenden, um den Raum oberhalb für ein AXES-Objekt zu verwenden. Wenn man dann einen weiteren Button benötigt, lässt man die Schleife einfach von k=1:6 laufen und benötigt ansonsten keine anderen Änderungen im Code! Wenn man es also geschickt angefangen hat, sind solche Erweiterungen einfacher als in GUIDE.
Diese Art der dynamischen Anpassung ist viel hübscher als 'Normalized' Units für z.B. Buttons. Wenn ich ein GUI auf einem 4K-Monitor maximiere, brauche ich keine Buttons, auf denen man Tennis spielen könnte. Aber auf einem 800*600 Display haben sie trotzdem noch die Mindest-Höhe, um lesbar zu sein. Durch den Scale-Faktor sieht das auf einem ultra-hochauflösendem Display auch benutzbar aus.
Ein weiterer Vorteil ist, dass man später leicht an den Parametern drehen kann, um die hübscheste Darstellung zu finden. Hier wäre das z.B. ButtonGap zu ändern, oder bei der ButtonHeight die Größe des verwendeten Fonts zu berücksichtigen.
Wenn man mehrere GUIs erzeugt, lohnt es sich, solche wiederkehrenden Aufgaben wie die Berücksichtigung der Auflösung und Font-Größen in eine eigene Funktion auszulagern.
danke für deine ausführliche Antwort. Der Code erscheint mir sinnvoll, leider habe bisher nicht die Zeit gefunden mit im Detail damit zu beschäftigen. Sollte es soweit sein, dann werde ich sicherlich nochmals ein Feedback dazu geben.
Vielen Dank.
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.