ich bin blutiger Anfänger, was den Umgang mit GUIs betrifft und hoffe auf eure Mithilfe
Hier habe ich schon einmal, vielleicht manche etwas dumme (sofern es das überhaupt gibt ) 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?
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.
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:
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.
MarkusW.
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 23.10.2011, 17:49
Titel:
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.
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
MarkusW.
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 28.10.2011, 11:52
Titel:
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?
Grundsätzlich kann man die unterliegenden Javaobjekte abändern...
Greetings
Marco
MarkusW.
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 03.11.2011, 11:50
Titel:
Hallo,
danke schonmal
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?
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.
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.
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
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.