Verfasst am: 22.11.2011, 02:07
Titel: 2 Pushbuttons in Unterfunktion
Hallo!
Ich habe ein Gui erstellt, in welchem der Nutzer 4 verschiedene "Berechnungen" abfragen kann.
Eine davon ist eine Animation erstellen mittels movie - getframe.
Das klappt alles, nur moechte ich jetzt den Nutzer fragen, ob er ein Replay will. Dazu erzeuge ich Text und 2 Pushbuttons (yes, no).
Jetzt will ich warten, bis der Nutzer auf ja oder nein klickt und dann soll entweder ein Replay starten oder die allgemeine Berechnung weitergehen.
Das waere kein Problem, aber ich habe es in eine Schleife geschrieben, da ich will, dass unendlich viele Replays fuer den Nutzer moeglich sind, bevor es weitergeht.
Code:
% ask for replay
go_on = 0;
while ~go_on
set(handles.text_output_values,'String',{'Animation was created','','Do you want to replay animation?'});
set(handles.text_output_values,'Position',[4.20.8567.24.31]);
set(handles.panel_outputvalues,'Position',[9646.3174.07.5]);
set(handles.button_yes,'Visible','on','Callback','uiresume(gcbf)');
set(handles.button_no,'Visible','on','Callback','uiresume(gcbf)');
uiwait(gcf);
ifget(handles.button_yes,'Value')
%play animation again
for l=1:length(scaffold)% different layers axis([-(scaffold(l).stage_dim/2+1), scaffold(l).stage_dim/2+1,...
-(scaffold(l).stage_dim/2+1), scaffold(l).stage_dim/2+1]);
axis equal;
movie(cell2mat(mov_cell{l}(1)));
movie(cell2mat(mov_cell{l}(2)),1,24);
movie(cell2mat(mov_cell{l}(3)),1,4);
end end% yes ifget(handles.button_no,'Value')
go_on = 1;
end% no end set(handles.panel_outputvalues,'Position',[9638.3174.015.5]);
set(handles.text_output_values,'Position',[4.20.8567.212.31]);
set(handles.button_yes,'Visible','off');
set(handles.button_no,'Visible','off');
Das funtioniert leider nicht mit uiwait bzw. er wartet, dass ich einen Knopf druecke, aber er fuehrt keine der Optionen aus - beide Values sind 0.
Wegen der Uebersichtlichkeit, steht dieser Text in einer Unterfunktion. Koennte es daran liegen?
Ich habe es auch schon mit button_yes_Callback versucht, aber wie bringe ich das Program dazu zu warten und dann das richtige Callback (yes/no) auszufuehren.
das liegt daran, dass ein pushbutton das propertie value nicht verwendet -> doc uicontrol -> Editable text, push buttons, and static text do not set this property.
Dementsprechend müsstest du es über togglebuttons oder über zusatzvariablen in deinem handles - struct regeln (es gibt auch noch andere möglichkeiten z.B. setappdata/getappdata)
Code:
function button_yes_callback(hObject, eventdata, handles)
handles.yes = true;
guidata(hObject,handles)
% in deinem code drawnow
handles = guidata(hObject); % neues handles struct laden ifisfield(handles,'yes') && handles.yes
handles.yes = false;% wieder zurücksetzen guidata(hObject,handles)% updaten % play animation again % ...
Verfasst am: 23.11.2011, 00:12
Titel: weitere Frage
Hallo Marco!
Danke fuer die schnelle Antwort.
Ich habe das so eingebaut und ich denke, es wuerde auch laufen, aber durch die while-Schleife ist der Computer busy - und tut nix mehr, da er staendig prueft, ob die While-Bedingung noch aktuell ist.
Habe deshalb eine pause(1) eingebaut und es geht fuer eine Runde- und dann kommt folgender Fehler:
Ich sollte handles.go_on aktualisieren, aber wie mache ich das? er kennt hObject nicht.
Das ist mein Code jetzt
Code:
handles.go_on = 0;
% handles = guidata(hObject); % neues handles struct laden --> er kennt hObject nicht while ~handles.go_on
handles.go_on = 0;
set(handles.text_output_values,'String',{'Animation was created','','Do you want to replay animation?'});
set(handles.text_output_values,'Position',[4.20.8567.24.31]);
set(handles.panel_outputvalues,'Position',[9646.3174.07.5]);
set(handles.togglebutton_yes,'Visible','on','Callback','uiresume(gcbf)'); % set(handles.togglebutton_no,'Visible','on','Callback','uiresume(gcbf)'); % % uiwait(handles.togglebutton_yes,5); pause(1);
togglebutton_yes_Callback(handles.togglebutton_yes, [], handles);
togglebutton_no_Callback(handles.togglebutton_no, [], handles);
handles = guidata(handles.togglebutton_yes); % neues handles struct laden ifisfield(handles,'yes') && handles.yes
handles.yes = false;% wieder zurücksetzen guidata(handles.togglebutton_yes,handles)% updaten % play animation again for l=1:length(scaffold)% different layers axis([-(scaffold(l).stage_dim/2+1), scaffold(l).stage_dim/2+1,...
-(scaffold(l).stage_dim/2+1), scaffold(l).stage_dim/2+1]);
axis equal;
movie(cell2mat(mov_cell{l}(1)));
movie(cell2mat(mov_cell{l}(2)),1,24);
movie(cell2mat(mov_cell{l}(3)),1,4);
end end end set(handles.panel_outputvalues,'Position',[9638.3174.015.5]);
set(handles.text_output_values,'Position',[4.20.8567.212.31]);
set(handles.button_yes,'Visible','off');
set(handles.button_no,'Visible','off');
% --- Executes on button press in togglebutton_yes. function togglebutton_yes_Callback(hObject, ~, handles) ifget(hObject,'Value')
handles.yes = true;
guidata(hObject,handles);
end
% --- Executes on button press in togglebutton_no. function togglebutton_no_Callback(hObject, ~, handles) ifget(hObject,'Value')
handles.go_on = 1;
guidata(hObject,handles);
end
irgendwie bringst du nun in deinem Code zeimlich viel durcheinander.
Zitat:
Dementsprechend müsstest du es über togglebuttons ODER über zusatzvariablen in deinem handles
Du Brauchst nach dieser guidata Methode keine Togglebuttons (das wäre umständlich). Wenn du Togglebuttons verwendest und diese dir genügen, dann kannst du das Property 'Value' abrufen.
Vll ist folgender Code leichter für dich (mit Togglebuttons)
Code:
go_on = 0;
while ~go_on
% ... drawnow; % muss eingefügt werden damit GUI geupdated wird (callbacks, objekte etc) ifget(handles.togglebutton_yes,'Value')% wenn togglebutton gedrückt set(handles.togglebutton_yes,'Value',false)% togglebutton zurücksetzen
%play animation again
for l=1:length(scaffold)% different layers axis([-(scaffold(l).stage_dim/2+1), scaffold(l).stage_dim/2+1,...
-(scaffold(l).stage_dim/2+1), scaffold(l).stage_dim/2+1]);
axis equal;
movie(cell2mat(mov_cell{l}(1)));
movie(cell2mat(mov_cell{l}(2)),1,24);
movie(cell2mat(mov_cell{l}(3)),1,4);
end end% yes
drawnow;% muss eingefügt werden damit GUI geupdated wird (callbacks, objekte etc)
ifget(handles.togglebutton_no,'Value')
go_on = 1;
set(handles.togglebutton_no,'Value',false)% togglebutton zurücksetzen end% no end
Ja, das hat meine Frage beantwortet! Danke, es funktioniert etzt einwandfrei.
Gruss,
Christiane
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.