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 ohne GUIDE Übergabe von handles

 

MatlabErlerner
Forum-Century

Forum-Century


Beiträge: 104
Anmeldedatum: 26.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.07.2015, 15:43     Titel: GUI ohne GUIDE Übergabe von handles
  Antworten mit Zitat      
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');
   
    if strcmp(str_entered, 'red')
        col_val = [1 0 0];
        handles.color = 'red';
    elseif strcmp(str_entered, 'green')
        col_val = [0 1 0];
        handles.color = 'green';
    elseif strcmp(str_entered, 'blue')
         col_val = [0 0 1];
         handles.color = 'yellow';
    else
        col_val = [0 0  0];
        handles.color = 'black';
    end
    set(handles.ellipse, 'facecolor', col_val);


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!

Grüße
Max

change_size.m
 Beschreibung:

Download
 Dateiname:  change_size.m
 Dateigröße:  293 Bytes
 Heruntergeladen:  361 mal
eg_fun.m
 Beschreibung:

Download
 Dateiname:  eg_fun.m
 Dateigröße:  681 Bytes
 Heruntergeladen:  328 mal
GOGYOUTUBE.m
 Beschreibung:

Download
 Dateiname:  GOGYOUTUBE.m
 Dateigröße:  1.22 KB
 Heruntergeladen:  310 mal
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 21.07.2015, 16:07     Titel:
  Antworten mit Zitat      
Hallo,

handles ist eine Variable, die jedes Mal gleich übergeben wird. Wenn color aktualisiert werden soll, musst du dir die aktuellen Handles mit
Code:
handles = guidata(object_handle);


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
MatlabErlerner
Themenstarter

Forum-Century

Forum-Century


Beiträge: 104
Anmeldedatum: 26.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.07.2015, 11:16     Titel:
  Antworten mit Zitat      
Hallo Harald,

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!

Grüße
Max
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.07.2015, 12:06     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
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.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
MatlabErlerner
Themenstarter

Forum-Century

Forum-Century


Beiträge: 104
Anmeldedatum: 26.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.07.2015, 13:30     Titel:
  Antworten mit Zitat      
Hallo Harald,

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

Grüße
Max
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: 22.07.2015, 14:19     Titel:
  Antworten mit Zitat      
Hallo MatlabErlerner,

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.

Statt guidata kann man auch gleich direkt set/getappdata verwenden.

Wenn man sich die Freiheit nimmt ohne GUIDE zu programmieren, kann (sollte) man dessen Design-Fehler nicht unbedingt übernehmen.

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

Forum-Century

Forum-Century


Beiträge: 104
Anmeldedatum: 26.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.07.2015, 10:28     Titel:
  Antworten mit Zitat      
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.
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.