Reset Button funktioniert nur in Verbindung mit Checkbox
Mira249
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 30.11.2013, 14:35
Titel: Reset Button funktioniert nur in Verbindung mit Checkbox
Hallo liebe Community,
Zunächst muss ich sagen, dass ich mich neben des Studiums erst seit knapp 3 Monaten mit Matlab beschäftige.
Nun habe ich ein kleines Problem mit einer Aufgabe:
- Es soll eine Schwingung im Grafikfenster geplottet werden.
- Eine Checkbox fragt nach der Dämpfung dieser Schwingung.
- Popupmenüs sollen der Darstellung des Plots dienen (Farbe, Markierung etc.)
- Die Parameter (Amplitude, Frequenz etc.) sollen in EditTextfelder eingegeben werden.
- Ein Aktualisieren des Plots soll via Pushbutton funktionieren.
Das Programm läuft generell. Ich habe jedoch 2 Fehler drin die ich nicht rausbekomme:
- Nach dem Start des Programmes reagieren die Popupbefehle zunächst nicht. Der Button muss zunächst ohne eine Veränderung der Popup-Menüs betätigt werden, damit diese anschließend reagieren.
- Der Button reagiert anschließend nur auf Veränderungen der Popup-Menüs. Veränderungen der Parameter in den EditTextfeldern werden nur wahrgenommen wenn die Checkbox ein- oder ausgeschaltet wird.
Mein Code (etwas reduziert auf OpeningFcn, Checkbox und Button):
guidata(hObject,handles);
% --- Outputs from this function are returned to the command line. functionvarargout = daempfung_OutputFcn(hObject, eventdata, handles) varargout{1} = handles.output;
% --- Executes on button press in checkbox1. function checkbox1_Callback(hObject, eventdata, handles)
uiwait
% Parameter Funktion
A=str2double(get(handles.amplitude,'String'));
f=str2double(get(handles.frequenz,'String'));
w=2*pi*f;
t0=str2double(get(handles.phase,'String'));
tende=str2double(get(handles.zeit,'String'));
t=1:tende;
delta=str2double(get(handles.daempfung,'String'));
S=A*sin(w*t+t0);
D=exp(-delta*t);
Sg=S.*D;
% Plot: ifget(hObject,'Value')==1
p1=plot(t,Sg,'r');
else
p1=plot(t,S,'r');
end
zoom on
xlabel('Zeit in s');
ylabel('Amplitude');
title('gedämpfte Schwingung');
grid on;
% Hint: get(hObject,'Value') returns toggle state of checkbox1
% --- Executes on selection change in linienfarbe. function linienfarbe_Callback(hObject, eventdata, handles) % hObject handle to linienfarbe (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
uiwait
val = get(hObject, 'Value');
str=get(hObject,'String');
switch(str{val}) case 'rot'
set(findobj('type', 'line'), 'color', 'red');
case 'blau'
set(findobj('type', 'line'), 'color', 'blue');
case 'gruen'
set(findobj('type', 'line'), 'color', 'green');
case 'schwarz'
set(findobj('type', 'line'), 'color', 'black');
end % Hints: contents = cellstr(get(hObject,'String')) returns linienfarbe contents as cell array % contents{get(hObject,'Value')} returns selected item from linienfarbe
% --- Executes on button press in aktualisieren. function aktualisieren_Callback(hObject, eventdata, handles) % hObject handle to aktualisieren (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
Die Frage, die ich mir gestellt habe, kann eine OpeningFcn überhaupt auf Änderungen per Pushbutton reagieren? Müsste ich nicht einen kompletten Reset ausführen? Warum sich jedoch die Popup-Menüs so verhalten ist mir rätselhaft.
Verfasst am: 01.12.2013, 00:26
Titel: Re: Reset Button funktioniert nur in Verbindung mit Checkbox
Hallo Mira249,
Mir wird das Problem nicht ganz klar.
Ein UIWAIT in einem Callback ist aber auf jeden Fall ungewöhnlich.
Die OpeningFcn wird nur ausgeführt, während das Fenster geöffnet wird. Diese Funktion wird dann also später nicht auf irgendewtas reagieren.
Zitat:
- Nach dem Start des Programmes reagieren die Popupbefehle zunächst nicht. Der Button muss zunächst ohne eine Veränderung der Popup-Menüs betätigt werden, damit diese anschließend reagieren.
Das kann ich anhande des gezeigten Codes nicht nachvollziehen. Du kannst den Debugger benutzen um heraus zu finden, wann wo welcher Code aufgerufen wird.
Zitat:
- Der Button reagiert anschließend nur auf Veränderungen der Popup-Menüs.
Um genau zu sein, reagiert ein Button nur auf das Darauf-Klicken mit der Maus. Deswegen verstehe ich nicht, wie er auf Veränderungen des Popup-Menüs reagieren sollte.
Das ist tückisch. Esverändert alle Line-Objekte in allen Matlab-Fenstern. Besser wäre es, Du speicherst die Handles der Line-Objekte explizit per GUIDATA.
Gruß, Jan
Mira249
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 01.12.2013, 13:44
Titel:
Hi, vielen Dank schon mal.
Die OpeningFcn soll erstmal nur der Darstellung der reinen Funktion dienen. Uiwait benötige ich in der OpeningFcn um die Parameter zu definieren. Die Funktion wird auch dargestellt (Die Parameter verändern sich anschließend nur über das Ein- oder Ausklicken der Checkbox)
Zitat:
Die OpeningFcn wird nur ausgeführt, während das Fenster geöffnet wird. Diese Funktion wird dann also später nicht auf irgendewtas reagieren.
Wahrscheinlich ist das der Grund, dass die PopUp-Menüs erst reagieren nachdem der Button einmal betätigt wurde.
Wenn ich nun die Checkbox (Dämpfung) aktiviere befinde ich mich ja in der entsprechenden Callbackfunktion und es wird auch die gedämpfte Funktion dargestellt.
Eine Aktualisierung der Funktionsparameter ist jedoch nun wie gesagt nur möglich wenn ich die Checkbox aktiviere oder deaktiviere mit einem anschließendem klick auf den Button.
Die PopUpMenüs reagieren anschließend einwandfrei bei einer Veränderung und anschließendem drücken des Buttons.
Nochmal kurz die Probleme:
- Eine Veränderung der Eingabeparameter nach Darstellung der Funktion ist nur möglich wenn die Checkbox aktiviert wird.
- Nach Aktivierung der Checkbox ist eine Veränderung der Eingabeparameter nur möglich wenn diese wieder deaktiviert wird usw.
- Die PopUpMenüs funktionieren nur einwandfrei wenn die Funktion einmal ohne eine Änderung der in den PopUpMenüs befindlichen Parameter ausgeführt wurde.
Ich habe wahrscheinlich irgendeine Verständnislücke, denn es müsste ja möglich sein, dass ich eine aktualisierung der Parameter per Editfelder vornehmen kann ohne mich in der Callbackfunction der Checkbox zu befinden?
Die OpeningFcn soll erstmal nur der Darstellung der reinen Funktion dienen.
Dafür ist sie nicht geeignet. Sie sollte wirklich nur das ausführen, was während des Öffnens des Fensters benötigt wird.
Der Zweck der UIWAIT- und UIRESUME-Befehle erschließt sich mir nicht, darum würde ich sie weglassen und das GUI anders organisieren.
Gruß, Jan
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.