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-Fragen

 

MarkusW.

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.10.2011, 15:55     Titel: GUI-Fragen
  Antworten mit Zitat      
Hallo,

ich bin blutiger Anfänger, was den Umgang mit GUIs betrifft und hoffe auf eure Mithilfe Smile

Hier habe ich schon einmal, vielleicht manche etwas dumme (sofern es das überhaupt gibt Wink ) Fragen.

1. Wieso haben die Funktionen, die von GUIDE erstellt werden, am Ende kein "end"?

2. Ich möchte, dass Tipps eingeblendet werden, wenn man mit der Maus über die verschiedenen GUI-Elemente fährt. Das funktioniert auch, nur bei "edit-text"-Feldern nicht. Ein setzten der Property "TooltipString" scheint hier erfolglos. Woran kann das liegen?


In der GUI, die ich bauen möchte, soll man:
- eine Auswahl über eine Berechnungsmethode treffen können
- Auswählen können, welche Geräte in die Berechnung mit einbezogen werden.
- sehen können, wie viele Geräte in der Berechnung berücksichtigt werden (also ausgewählt wurden).
- Geräte hinzufügen können, die dann ev. berücksichtigt werden.

D.h. also, dass die GUI irgendwie abspeichern muss, welche Geräte es gibt. Es kann sehr viele Geräte geben und diese haben auch teilweise viele verschiedene Eigenschaften, die berücksichtigt werden müssen.
Frage: Wie speichere ich das am besten ab, so dass ich die Daten mit dem GUI manipulieren kann und später in einem Skript verwenden? Kann man das so schon beantworten?

Wie ist das allgemeine Vorgehen bei GUIs? Wird bespielsweise eine CheckBox ausgewählt, setze ich einfach in der GUI.m eine Variable auf 1 und diese Variable übergebe ich dann an ein Skript, welches die eigentliche Berechnung unter Berücksichtigung des Wertes dieser Variable ausführt?

Gruß
Markus


eupho
Forum-Meister

Forum-Meister


Beiträge: 777
Anmeldedatum: 07.01.09
Wohnort: Marburg
Version: R2009b
     Beitrag Verfasst am: 23.10.2011, 16:18     Titel:
  Antworten mit Zitat      
Hui, das sind aber ein paar Fragen Smile

1) Siehe in der Hilfe zu function, dort steht genau erklärt wann und warum man end benötigt. Um es abzukürzen, für GUI .m-Datei benötigst du keine function-ends. Der Intepreter erkennt an dem Wort "function", dass die alte Funktion zu Ende ist.

2) Also bei mir funktioniert der TooltipString auch bei edit-Boxen, vielleicht solltest du das nochmal versuchen... Möglicherweise hast du den Status (Property 'Enabled') auf 'off' oder 'inactive'.

3) Die Eigenschaften der Geräte kannst du strukturiert in einer struct-Variablen mit frei wählbaren Feldnamen abgespeichern und dann als .mat-Datei auf der Festplatte ablegen.

4) Zum allgemeinen Vorgehen bei GUIs schaust du dir am besten Einsteigertutorials an, diese gibt es auch speziell für GUIs.
Private Nachricht senden Benutzer-Profile anzeigen
 
Matt Lappen
Forum-Anfänger

Forum-Anfänger


Beiträge: 42
Anmeldedatum: 23.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.10.2011, 16:31     Titel:
  Antworten mit Zitat      
Hi Markus,

Ich gehe bei Erstellen von GUIs immer wie folgt vor:

Ich erstelle ein Skript für die Oberfläche, platziere alle Buttons, Checkboxen und Dropdowns via uicontrols und setze pro ui-Control ein Callback.
Das sieht ungefähr so aus:
Code:

function Bedienoberfläche()
load 'parameter.mat'
% ...
% ...
uicontrol(h, 'Style', 'PopupMenu', 'Position', [B*0.01 H*0.62 320 30],'FontSize',9,'FontName','Arial','BackgroundColor',[1 1 0.95] , 'HorizontalAlignment', 'left', 'String', {'Messgerätl1','Messgerät2'},
'Value',var_geraet,...
'Callback', {@geraet_change});
 

Sind alle uis platziert (kein end erforderlich), so kannst du Callback direkt darunter schreiben, diese werden aktiviert, sobald du ein ui verwendest. Das zugehörige Callback {@geraet_change} sieht dann so aus:
Code:

function geraet_change(geraet, e, hObj1)
load 'parameter.mat'
var_geraet = get(geraet, 'Value');
save('parameter.mat','var_geraet')
 

In einem mat-File (hier parameter.mat) lege ich alle erfassten Werte und getroffenen Optionen ab, die ich über andere Skripte dann laden kann. Wie eupho sagt, am besten auch als struct, aber das bleibt dir offen.
Bei einer Checkbox kannst du beispielsweise einen Wert auf null oder auf 1 setzen und ebenfalls in die Parameterdatei speichern.

Ich glaube dass die GUIs bei jedem anders aussehen und jeder da so seinen eigenen Stil hat. Aber vielleicht hilfts dir ja weiter.

Zum Tooltipstring: hab auch keine richtige Antwort parat, wenn du dich allerdings nicht weiter rumärgern willst, lege ne leere Textbox drunter, und definiere für diese nen String.
Private Nachricht senden Benutzer-Profile anzeigen
 
MarkusW.

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.10.2011, 17:49     Titel:
  Antworten mit Zitat      
Hallo!

@eupho:

Zitat:
2) Also bei mir funktioniert der TooltipString auch bei edit-Boxen, vielleicht solltest du das nochmal versuchen... Möglicherweise hast du den Status (Property 'Enabled') auf 'off' oder 'inactive'.


Du hast recht, das edit-feld ist auf "inactive". Das habe ich so gemacht, weil ich dann einen Rand und eine Hintergrundfarbe für meine Schrift habe.
Natürlich ärgerlich, wenn jetzt die Tooltips dort nicht mehr funktionieren.

@Matt:

Gut, mein GUI habe ich jetzt mit GUIDE "designed", ist aber ja wahrscheinlich egal. Das heißt, dass du die Einstellungen, die man in der GUI vornehmen kann, alle in Variablen kodiert in einer extra *.mat Datei abspeicherst. Ist natürlich auch eine Möglichkeit, ja. Könnte ich auch irgendwie Variablen definieren, auf die ich in allen Funktionen der GUI.m zugreifen kann, und die für die anderen Skripte dann im Workspace ist oder soetwas? Dann müsste man die "parameter.mat" nicht die ganze Zeit speichern und laden, auch wenn das wahrscheinlich kaum Zeit ausmachen dürfte.
 
Matt Lappen
Forum-Anfänger

Forum-Anfänger


Beiträge: 42
Anmeldedatum: 23.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.10.2011, 18:14     Titel:
  Antworten mit Zitat      
Dass ich die Variablen in einem Mat-File schreibe, hat bei mir meist den Hintergrund, dass ich beim Start (oder auch beim Restart) der GUI, die Einstellungen der letzen Anwendung laden kann, was besonders bei großem Funktionsumfang nützlich ist. Weiterhin kann ich häufiger meinen Workspace leeren und dann weiter mit den Variablen arbeiten, da ich sie wieder laden kann. Wie gesagt, jeder hat da wohl seine Eigenart.

Da ich ja nichts genaueres über die Verschachtelung deiner Gui und weiteren Skripten / Funktionen kenne, ist es schwer zu sagen, wie am besten vorzugehen ist. Zu beachten ist allerdings, dass jede Funktion (also auch die Callbacks der GUI) in ihrem eigenen Workspace arbeitet (dem sog. 'Caller'). Du kannst von dort aus auch Variablen in jeden beliebigen Workspace schreiben (z.B. mit dem assigning-Befehl), so kannst du auch Variablen in den base-Workspace schreiben, welche von verschiedenen Funktionen und Skripten dann verwendet werden können
Private Nachricht senden Benutzer-Profile anzeigen
 
MarkusW.

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.10.2011, 11:52     Titel:
  Antworten mit Zitat      
Hey,

stimmt, dass ich die ursprünglichen Settings beim Programmstart laden kann, ist sicher nice to have.

Ich würde gerne noch einmal auf mein Problem mit den Tooltips für editable-text zu sprechen kommen, wenn ich diese auf "inactive" setze. Ich habe diesen Workaround ursprünglich gemacht, weil ich eine Textbox haben wollte, in der man den Text nicht ändern kann, welche aber einen Rand hat. Kann ich das auch mit den eigentlichen edit-text Boxen erreichen? Oder kann ich meine inactive-edit-textfelder vielleicht doch dazu bekommen, einen Tooltip anzuzeigen?

(bisher alles mit GUIDE gemacht)

Gruß,
MarkusW.
 
Matt Lappen
Forum-Anfänger

Forum-Anfänger


Beiträge: 42
Anmeldedatum: 23.10.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.10.2011, 12:33     Titel:
  Antworten mit Zitat      
Hey Markus,
Dann arbeite doch einfach mit annotations, da kannst du den Rand beliebig verändern.
Code:
at=annotation('textbox','String','Hallo','Edgecolor','r','LineWidth',2);


Edit: Mein Fehler - hier gibts ja keine Tooltipstrings
Private Nachricht senden Benutzer-Profile anzeigen
 
Marco H.
Forum-Guru

Forum-Guru


Beiträge: 404
Anmeldedatum: 12.11.10
Wohnort: Dortmund
Version: 2010a/2012b
     Beitrag Verfasst am: 28.10.2011, 13:07     Titel:
  Antworten mit Zitat      
Hey,

für solche Sachen gibt es Nützliches hier:
http://undocumentedmatlab.com/blog/.....-uicontrol-tooltip-hacks/

Grundsätzlich kann man die unterliegenden Javaobjekte abändern...

Greetings

Marco
Private Nachricht senden Benutzer-Profile anzeigen
 
MarkusW.

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.11.2011, 11:50     Titel:
  Antworten mit Zitat      
Hallo,

danke schonmal Wink

Ich glaube wo es bei mir noch hakt, ist das Verständnis von GUIDE und "programmierten" GUIs. Wenn ich mit GUIDE ein GUI anlege, dann enthält ja das *.fig file die meisten Informationen über das GUI selbst, das *.m file enthält nur die Funktionen.

Wie kann ich also die GUI Elemente manipulieren, wenn ich das GUI mit GUIDE angelegt habe?
Kann ich irgendwie GUIDE und das "Programmieren" vermischen?
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 03.11.2011, 14:08     Titel:
  Antworten mit Zitat      
Hallo MarkusW,

Das .fig File ist nur ein MAT-File, welches einen Struct mit Anweisungen und Daten enthält, die zum Erstellen der Figure nötig sind.
Alle Callback-Funktionen stehen dagegen im M-file.

In den FileExchange-Seiten bei MathWorks findet man einige Tools, die aus dem FIG-File direkt ausführbaren Code erzeugen. Das hilft z.B. wenn Fehler im FIG-File gelandet sind, die man nicht mehr raus bekommt.

Das Mischen von GUIDE-Code und manueller Programmierung geht direkt. Allerdings wird GUIDE davon verwirrt. Ein häufiges Hin- und Her-Wechseln kann deshalb zu Problemen führen. Ich verwende GUIDE deshalb nur um die GUIs zunächst zu Layouten, z.B. die Buttons so lange zu verschieben, bis es griffig aussieht. Danach besorge ich mir die Positionen der Elemente aus dem FIG-File und implementiere die gesamte Funktionalität manuell.
Diese Methode benötige ich hauptsächlich, weil ich gleichzeitig für Matlab 5.3, 6.5, 7.0, 2008a, 2009a und 2011b entwickle. Davon is GUIDE überfordert.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
bumbumquietsch*
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 55
Anmeldedatum: 17.10.11
Wohnort: München
Version: R2011b
     Beitrag Verfasst am: 03.11.2011, 15:58     Titel:
  Antworten mit Zitat      
Wie kann in den im gui.m - File erstellen Funktionen Werte an den Workspace bzw. an ein m-File geben, dass das Gui aufgerufen hat ?


Main.m


---> ruft Gui auf

---------> Funktion im Gui wird ausgeführt

--------------> Funkktion im Gui liefert werte

--------->Rückgabe zur Funktion im Gui

--->Rückgabe zur allgemeinen Funktion

Rückgabe zur Main
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: 03.11.2011, 16:46     Titel:
  Antworten mit Zitat      
Hallo bumbumquietsch*,

Das Mischen von Graphischer Benutzeroberfläche und Funktionen zur Berechnung macht die Handhabung kompliziert. Es ist deutlich praktischer das GUI nur als GUI zu verwenden und die Berechnungen in einer eigenen Funktion durchzuführen.

Prinzipliell ist Dein Problem aber auch per "Funktion wird im GUI ausgeführt" machbar. Dazu verwendet man einfach Inputs und Outputs.
Mir ist nicht klar, was "Rückgabe zur allgemeinen Funktion" und "Main" genau bedeutet. Eigentlich ist bei der Weitergabe der Variablen kein Unterschied zu einem Aufruf von Unterprogrammen oder anderen Funktionen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
bumbumquietsch*
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 55
Anmeldedatum: 17.10.11
Wohnort: München
Version: R2011b
     Beitrag Verfasst am: 04.11.2011, 09:12     Titel:
  Antworten mit Zitat      
hihi

geht um folgendes: In einer GUI soll die Möglichkeit gegeben werden eine Datei zu öffnen ( Menü -> öffnen -> Auswahlfenster öffnet sich.)
Meine Main ist ein m-file, welches alle funktionen aufruft bzw. wo alles zusammenläuft.

1. Main Datei/Hauptprogramm
--> Dieses M-File wird gestartet, es wird die GUI aufgerufen

2. Den aktuellen GUI aufruf realisiere ich durch "run gui". Dies startet das GUI, gibt mir aber keine Möglichkeit einen Wert zurückzugeben

3. Ich möchte diese GUI wie eine Funtkion aufrufen, doch ich weis eben nicht wie ?!?!

4. in Dieser GUi entstehen 2 variablen (fname und fpath) die beim öffnen meiner Datei belegt werden.

5. diese beiden Variablen sollen nun an die MAIN-/Hauptdatei weitergegeben werden damit die Hauptdatei diese weiterverarbeiten kann.

--> Meine Probleme: Wie gebe ich diese beiden Werte in der GUI weiter damit ich Sie in meiner MAIN/Hauptdatei weiterverarbeiten kann ?! Ich komme einfach mit der Notation der handles, hObject und varargin nicht klar und weis eben nicht wie ich hier etwas zurückgeben kann
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 - 2025 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.