Verfasst am: 21.07.2015, 15:43
Titel: GUI ohne GUIDE Übergabe von handles
Hallo zusammen,
ich probiere mich gerade ein wenig in der GUI-Programmierung ohne GUIDE.
Zuerst habe ich alle Objekte auf der figure platziert und angeordnet (wie in dem Beispiel, was ich aus dem Netz habe). Dann habe ich mit der set-Funktion die Callbacks festgelegt (Dies habe ich erst nach dem Bauen der Gui gemacht, weil z.B. die Callback-Funktion des Buutons sowohl den handle der Editbox, als auch den handle der Ellipse benötigt. Sprich, wenn eines davon noch nicht erstellt worden wäre, könnte ich die Callbackfunktion nichtr aufrufen und bekomme Fehler). Daher dieser Weg.
Jetzt habe ich in der eg_fun-Funktion neue handles definiert:
Code:
%updated eg_fun used to demonstrate passing variables
%copy paste this code into a file called eg_fun.m function eg_fun(object_handle, event, handles)
str_entered = get(handles.edit_box, 'string');
handles.color ist neu hinzugekommen. Allerdings schaffe ich es nicht, dass der anfangs als leer definierte handle handles.color beim Aufruf der Funktion auch den eingegeben Farb-Namen speichert. Irgendwie scheint die guidata-Funktion nicht zu funktionieren. Hat jemand eine Ahnung wieso? Und kann mir jemand helfen, wie ich das Probleme löse. Anbei habe ich mal die drei Dateien angefügt!
leider hat die von Dir beschriebene Abhilfe keinen Effekt gehabt. Ich habe mir über den Debugger die handles angeguckt. Leider steht immer noch nicht 'green' in den handles.color, obwohl ich 'green' eingegeben habe. Wie gesagt, ich glaube mit der guidata(object_handle, handles) bzw. wie du es geschrieben hast handles = guidata(object_handle); gibt es ein Problem.
Zwei weitere Fragen hierzu, wie schaffe ich es z.B., das ich mir ohne GUIDE eine GUI aufbaue, die die gleiche Struktur hat, wie eine in mit GUIDE erstellte? Sprich, dass ich createFCN, callbackFCN etc. habe.
Weil ich werde das Gefühl nicht los, dass es nicht die optimale Lösung ist, einfach erst alle Objekte auf die GUI zu setzen und dann über set(handles.....) die ganzen callbacks zu definieren.
Gibt es da eine elegantere Lösung? Bzw. wie sieht eine elegantere Lösung aus, weil, dass es eine gibt, da bin ich mir eigentlich ziemlich sicher!
leider hat die von Dir beschriebene Abhilfe keinen Effekt gehabt.
Wo hast du es denn eingefügt?
Zitat:
Ich habe mir über den Debugger die handles angeguckt.
Wie ist der Ablauf der Nutzung der GUI, und wo schaust du dir handles an?
Zitat:
ich glaube mit der guidata(object_handle, handles) bzw. wie du es geschrieben hast handles = guidata(object_handle); gibt es ein Problem.
Ich glaube dagegen, dass nicht guidata das Problem ist (dieses Problem gäbe es ja seit mehr als 10 Jahren), sondern die Nutzung davon.
Zitat:
wie schaffe ich es z.B., das ich mir ohne GUIDE eine GUI aufbaue, die die gleiche Struktur hat, wie eine in mit GUIDE erstellte? Sprich, dass ich createFCN, callbackFCN etc. habe.
Warum möchtest du das, und was hält dich dann davon ab, GUIDE zu verwenden?
Zitat:
Weil ich werde das Gefühl nicht los, dass es nicht die optimale Lösung ist, einfach erst alle Objekte auf die GUI zu setzen und dann über set(handles.....) die ganzen callbacks zu definieren.
Man kann auch direkt bei der Erstellung der Objekte die Callback-Eigenschaft setzen. Es ist ja im Grunde nur eine Eigenschaft wie jede andere auch.
Also GUIDE möchte ich nicht verwenden, da ich in GUIDE keine Möglichkeit sehe ohne irgendwelche Toolboxen vernünftig Tabs einzubauen.
Daher die Wahl auf eine GUI-Programmierung ohne GUIDE.
Das ist mir bewusst, dass 'callback' lediglich eine Eigenschaft der Objekte ist. Deswegen kann man ja auch die set-Funktion nutzen. Das Problem ist nur, dass es Fälle gibt, in denen ich beispielsweise einen Button gebastelt habe, der dann in der 'callback'-Funktion die Funktion 'Button_druecken' stehen hat. Diese Funktion benötigt aber Informationen von anderen Objekte, bspw. von einem Edit-Feld den String. Wird dieses Edit-Feld jedoch erst nach dem Button 'gebaut', gibt es das Objekt noch gar nicht. Jetzt wäre es hier ganz einfach, dass man den Button einfach nach dem Edit-Feld baut. Jedoch funktioniert dieses 'einfache' Verschieben bei komplexeren GUIS nicht mehr. Daher war eben die Idee, erst alle Elemente zu bauen und dann per set die Callbacks zu setzen.
Ich weiß, ich bin sehr neu auf dem Gebiet und stelle mich wahrscheinlich gerade wieder extrem ungeschickt an, aber ich kann es halt nunmal momentan einfach nicht besser und weiß mir nicht anders zu helfen. Daher wende ich mich ja auch an das Forum hier.
Ich habe deinen Code direkt an der Stelle in der eg_fun.m eingefügt, wo vorher stand: guidata(object_handle, handles).
Die Lösung ist ganz einfach:
Du kannst die Callbacks gleich mit den Objekten erstellen. Das einzige Problem dabei ist ja, dass der dann im Callback übergebene handles-Struct noch nicht komplett ist. Aber wenn man sowieso auf GUIDE verzichtet, kann man sich auch den handles-Struct in den Inputs der Callbacks sparen und hat diese ganzen Probleme erst gar nicht:
Code:
handles.FigH = figure;
handles.StartButton = uicontrol(..., 'Callback', @startCB)
handles.StopButton = uicontrol(..., 'Callback', @stopCB) ... % Nun wird der fertige handles-Struct im GUI gespeichert: guidata(handles.FigH, handles);
function startCB(ObjectH, EventData)
handles = guidata(ObjectH); % Get handles from figure ...
handles.newValue = rand;
guidata(ObjectH, handles); % Store updated handles in figure
function stopCB(ObjectH, EventData)
handles = guidata(ObjectH); % Get handles from figure ... disp(handles.newValue) guidata(ObjectH, handles); % Store updated handles in figure, not required here
Der Trick ist also einfach auf die Nutzung des handles-Structs als Input der Funktionen zu verzichten und stattdessen konsequent mit
guidata
zu arbeiten.
Vielen Dank für die Antwort Jan, ich glaube ich habe verstanden, was du meinst. Ich war von meinen Überlegungen glaube ich noch zu sehr in der GUI-Programmierung mit GUIDE gefangen.
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.