Verfasst am: 17.06.2011, 12:39
Titel: Radiobutton nicht gleich aktiv bzw Daten nicht verarbeitet
Habe 2 Radiobuttons in einem Panel (einer ist auf 1, der ander auf 0 gestellt)
Diese bewirken 2 unterschiedliche Ausgaben in einer "Axes" und mit einem Pushbutton "Plot" wird eine Grafik erstellt.
Warum werden nicht automatisch die werte aus dem 1. Radiobutton genommen sondern, wenn ich Plot drücke zuerst die initialisierten Daten und erst wenn ich den Radiobutton wechsle kann ich zwischen den beiden Radiobuttons hin und her springen und die richtige Grafik wird gezeichent?
Danke
Gast
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 17.06.2011, 13:44
Titel:
Hm,
Poste doch bitte die entsprechenden Callbacks, so kann man leider nur sagen, dass da wohl was ist, was nicht so sein soll.
function X_radiobutton_Callback(hObject, eventdata, handles) % hObject handle to X_radiobutton (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of X_radiobutton
% --- Executes on button press in Y_radiobutton. function Y_radiobutton_Callback(hObject, eventdata, handles) % hObject handle to Y_radiobutton (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of Y_radiobutton
function Panel_SelectionChangeFcn(hObject, eventdata)
%retrieve GUI data, i.e. the handles structure
handles = guidata(hObject);
switchget(eventdata.NewValue,'Tag')% Get Tag of selected object case 'X_radiobutton'
%execute this code
handles.X = 2*handles.x;
handles.Y = handles.y;
case 'Y_radiobutton'
%execute this code when
handles.X = handles.x;
handles.Y = 2*handles.y;
auch ich habe ein ähnliches Problem, für das ich noch nach einer Lösung suche:
Wie kann ich die SelectionChangeFcn nutzen, obwohl es keinen "Change", also kein User-Event gibt?
Im Detail heißt das:
> Ich arbeite mit Guide und habe dort
> Mehrere RadioButtons in einer ButtonGroup
> Die zugehörige SelectionChangeFcn mit switch-cases für die "changes"
> Eine Initialiserung des ButtonGroup also welcher RadioButton ausgewählt ist in der OpeningFcn
> In der SelectionChangeFcn wird eine Variable definiert.
> Die SelectionChangeFcn wird als SelectionChangeDefiniert:set(handles.ButtonGroup,'SelectionChangeFcn',@ButtonGroup_SelectionChangeFcn)
Mein Problem ist nun, dass diese Variable nicht erstellt wird, da anscheinend die Definition im Programm set(handle.MeinRadioButton1,'value',1) KEIN gültiges Change-Event ist, das eine Change-Fcn bzw. stellvertretend die SelectionChangeFcn aufruft.
Wie bringe ich dem dooofen Matlab nun meine programmtechnisch realisierte Vorauswahl bei??? Muss ich einen Umweg über eine weitere Fkt gehen, oder muss die Change-Fkt via set(..., change-fkt) angesprochen werden?
du kannst natürlich jeden Callback wie jede andere Funktion auch zu jeder Zeit aufrufen z.B.
Code:
function untitled_OpeningFcn(hObject, eventdata, handles, varargin) % This function has no output args, see OutputFcn. % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to untitled (see VARARGIN)
set(handles.uipanel1,'SelectionChangeFcn',@change) set(handles.radiobutton2,'Value',1)% radio setzen
change(handles.uipanel1,handles.radiobutton2)% callback aufrufen
% Choose default command line output for untitled
handles.output = hObject;
danke für dein Beispiel. Diesem entnehme ich, wie ich eine eigene Callback-Funktion:
> definiere (function change(hObj,evd) ...)
> zuweise (set(handles.uipanel1,'SelectionChangeFcn',@change)) und
> aufrufe (change(handles.uipanel1,handles.radiobutton2))
Allerdings klemmt es jetzt bei mir mit der Variable "eventdata", bei dir "evd" genannt. Diese verwendest du bei deinem Vorschlag ja fleißig. Leider ist mir die Verwendung dieser Variable nicht so vertraut und aus dem thread "hObject, eventdata, handles --Was ist das eigentlich???---" ([url] http://www.gomatlab.de/hobject-even.....das-eigentlich-t2683.html [/url]) werde ich nicht so richtig schlau.
Bisher habe ich die Werte einer Button-Group via switch-case mit get(eventdata.NewValue,'Tag') ausgelesen. Diese kann ich auch für das händische Ändern der Auswahl einbauen. Im Falle der Initialisierung (ishandle...) gibt es aber keine Variable "NewValue":
ifishandle(evd)% manueller aufruf
c = 1
%get(hObj.NewValue,'Tag') else% aufruf wenn vom user geändert
c = 2 switchget(evd.NewValue,'Tag')% Get Tag of selected object case 'radiobutton1'
w = 1 case 'radiobutton2'
w = 2 case 'radiobutton3'
w = 3 end end
guidata(hObject, handles)% Übernehmen der Änderungen
Wie baue ich eine solche Abfrage auch in den ersten Fall ein?
Zitat:
Ich weiß wohl nicht wofür du es brauchst aber möglich ist es...
Ziel meiner Bemühungen ist ein Voreinstellen des UI über ein extra file zu definieren (m-function, in der ein struct definiert wird, dass alle Voreinstellungen enthält), damit Import- und Exportpfade und Bearbeitungsvarianten nicht immer eingegeben und angeklickt werden müssen.
klingt ja ganz sinnig was du da vorhast. Erstmal eine kurze Erklärung. Wenn der User das evend auslöst dann ist das hObject im Callback das uipanel indem sich die Radios befinden. In evenddata wird intern ein Struct erstellt mit 3 Feldern indem unter anderem NewValue und OldValue enthalten sind. Am besten debugge es mal und du wirst es sehen. Dies wird aber nicht ausgelöst wenn du manuell den Wert eines Radios änderst. Also habe ich einfach dem Callback beim manuellen Aufruf 2 handles mitübergen. Du kannst ihm auch andere Werte übergen also so benutzen wie eine normale function.
Also hast du nun mehrere Möglichkeiten dein Ziel zu erreichen.
1. Du setzt alles aus deiner Opening_fcn ohne auf die Callbacks zurückzugreifen
2. Du benutzt die Callbacks, musst diese aber ggf. anpassen (Unterscheidung ob evend oder manueller aufruf (z.B. bei uitables & Radios)) oder du erstellst in der Opening_fcn ein Struct welches gleich dem evenddata ist und übergibst dieses dem Callback z.B.
3. Du schreibst eine Klasse mit passenden Methoden der du einfach dein Struct, welches du in deinem m-File erzeugt hast (bzw. bringst diese Funktionalität auch in der Klasse unter) übergibst und steuerst damit die GUI (dies setzt natürlich Kenntnisse in der oop voraus)
Ich benutzte nur die 1. & 3. Variante, wobei es immer auf den Umfang der GUI ankommt.
@Marco: vielen Dank für die Hinweise. Gerade der Debugger hat mich ein wenig verstehen lassen, warum welche Fehlermeldung erscheint. Habe dann wie gesagt beim "manuellen Aufruf" kein "NewValue" gefunden, mich aber weiter auf die Suche begeben. Bei genauem Hinschauen habe ich gemerkt, dass ich, egal wie RadioButton manipuliert wurden, 'automatisch' auf ihre Stati (nach neuer Rechtschreibung Statuse oder Statusse?) zugreifen kann, wenn ich mit Children arbeite. Mit 'automatisch' meine ich, dass mir egal ist, wieviele Buttons ich habe und dass ich nicht einen speziellen Button als event übergeben möchte. Das Ganze habe ich dann in eine Funktion gepackt, die da lautet:
Code:
function KnopfNr = AktivenRadiobuttonFinden(hObject)
% hObject = die ButtonGroup, die die Radiobuttons vereint % Die Radiobuttons sind Kind-Objekte der Buttongroup % Achtung: die Buttons werden von unten nach oben gezählt, da das % Koordinatensystem unten links liegt.
% Objekte der Radiobuttons (rbs) übergeben:
rbs = get(hObject,'Children');
% Den aktiven Radiobutton finden: for child = 1:length(rbs) ifget(rbs(child),'value')
KnopfNr = length(rbs) + 1 - child; % Zählweise s.o. Anmerkung!!! return end end
Diese Funktion kann ich dann an verschiedensten Stellen verwenden. Als erstes mal kann der Callback einer jeden Buttongroup darauf zugreifen. Ebenso kann ich mein GUI z.B. in der OpeningFcn initialisieren bzw. schon im Guide Buttons vorauswählen. Anschließend ließe sich der Status mit der Funktion einfach auslesen.
So, ich danke für die Hilfe und hoffe auch so einigen Mitlesenden geholfen zu haben. Hoffentlich gibt es für genau mein Problem nicht schon eine direkte Matlab-interne Lösung. Gerne nehme ich auch Anregungen und Verbesserungsvorschläge entgegen.
wenn du einfach nach dem gewählten Radio suchen willst kannst du auch z.B. deine for Schleife weg lassen
Code:
function gew_radio = AktivenRadiobuttonFinden(hObject) % Den aktiven Radiobutton finden:
gew_radio = findobj(get(hObject,'Children'),'Value',1);% handle des gewählten buttons if ~isempty(gew_radio) % ... else % ... end
fein, mit findobj habe ich wieder einen neuen Befehl in mein Repertoire aufgenommen. Dank Debugger habe ich noch eine weitere interessante Variable gefunden, die genau unser ausgewähltes Element wiedergibt:
das steht auch gut in der Matlab Hilfe. Du kannst nach Handles mit pestimmten Propertieeigenschaften such wie in diesem Fall 'Value' == 1.
MfG Marco
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.