WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

GUI Bedienelemente geschickt positionieren ohne GUIDE

 

Martinuk
Forum-Century

Forum-Century


Beiträge: 208
Anmeldedatum: 18.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.10.2014, 12:52     Titel: GUI Bedienelemente geschickt positionieren ohne GUIDE
  Antworten mit Zitat      
Hallo Leute,

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?

Bitte um viele Vorschläge und Erfahrungen.

Danke.
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 01.11.2014, 13:42     Titel: Re: GUI Bedienelemente geschickt positionieren ohne GUIDE
  Antworten mit Zitat      
Hallo Martinuk,

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.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Martinuk
Themenstarter

Forum-Century

Forum-Century


Beiträge: 208
Anmeldedatum: 18.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.11.2014, 22:00     Titel:
  Antworten mit Zitat      
Hallo Jan,

danke für deine Antwort.

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?

Danke.
Private Nachricht senden Benutzer-Profile anzeigen
 
Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 18.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 03.11.2014, 00:10     Titel:
  Antworten mit Zitat      
Hallo Martin,

Kennst du die GUI-Beispiele aus FileExchange?

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

Grüße,
Seban
_________________

Richtig fragen
Debugging
Private Nachricht senden Benutzer-Profile anzeigen
 
Martinuk
Themenstarter

Forum-Century

Forum-Century


Beiträge: 208
Anmeldedatum: 18.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.11.2014, 19:38     Titel:
  Antworten mit Zitat      
Hallo Seban,

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.

Cool, danke ...
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 04.11.2014, 00:39     Titel:
  Antworten mit Zitat      
Hallo Martinuk,

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.

Ein Code-Beispiel wäre etwas wie:
Code:
FigH = figure('Units', 'pixels');
scale = get(0, 'ScreenPixelsPerInch') / 96;
H.ButtonHeight = 22 * scale;
H.ButtonGap = 10 * scale;

H.Button = zeros(1, 5);
y = H.ButtonGap;
for k = 1:5
  H.Button(k) = uicontrol('Style', 'PushButton', 'String', sprintf('Button %d', k), ...
              'Units', 'pixels', 'Position', [H.ButtonGap, y, 80, H.ButtonHeight]);
  y = y + H.ButtonGap + H.ButtonHeight;
end
setappdata(FigH, 'GuiControl', H);

drawnow;
set(FigH, 'ResizeFcn', @GuiResize);
 

In einem echten Code würde man die ResizeFcn gleich im FIGURE-Befehl definieren.

Jetzt könntest Du in der ResizeFcn die Button-Breite z.B. dynamisch an das Fenster anpassen:
Code:
function GuiResize(FigH, EventData)
H = getappdata(FigH, 'GuiControl');
FigSize = get(FigH, 'Position');
Width = FigSize(3) - 2* H.ButtonGap;

y = H.ButtonGap;
for k = 1:5
  set(H.Button(k), 'Position', [H.ButtonGap, y, Width, H.ButtonHeight]);
  y = y + H.ButtonGap + H.ButtonHeight;
end

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.

Viele Grüße, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Martinuk
Themenstarter

Forum-Century

Forum-Century


Beiträge: 208
Anmeldedatum: 18.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.02.2015, 20:38     Titel:
  Antworten mit Zitat      
Hallo Jan,

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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.