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

2 Pushbuttons in Unterfunktion

 

chris4aus
Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 11.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.11.2011, 02:07     Titel: 2 Pushbuttons in Unterfunktion
  Antworten mit Zitat      
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.2 0.85 67.2 4.31]);
    set(handles.panel_outputvalues,'Position',[96 46.31 74.0 7.5]);
    set(handles.button_yes,'Visible','on','Callback','uiresume(gcbf)');
    set(handles.button_no,'Visible','on','Callback','uiresume(gcbf)');
    uiwait(gcf);
    if get(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
    if get(handles.button_no,'Value')
        go_on = 1;
    end % no
end
set(handles.panel_outputvalues,'Position',[96 38.31 74.0 15.5]);
set(handles.text_output_values,'Position',[4.2 0.85 67.2 12.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.

Hoffe, ich koennt mir helfen.

Gruss,
Christiane
Private Nachricht senden Benutzer-Profile anzeigen


Marco H.
Forum-Guru

Forum-Guru


Beiträge: 404
Anmeldedatum: 12.11.10
Wohnort: Dortmund
Version: 2010a/2012b
     Beitrag Verfasst am: 22.11.2011, 10:35     Titel:
  Antworten mit Zitat      
Hey,

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
if isfield(handles,'yes') && handles.yes
        handles.yes = false;% wieder zurücksetzen
        guidata(hObject,handles) % updaten
        % play animation again
        % ...

 


Greetings
Marco
Private Nachricht senden Benutzer-Profile anzeigen
 
chris4aus
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 11.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.11.2011, 00:12     Titel: weitere Frage
  Antworten mit Zitat      
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:
Code:
??? Reference to non-existent field 'go_on'.

Error in ==> fun_ani at 23
while ~handles.go_on


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.2 0.85 67.2 4.31]);
    set(handles.panel_outputvalues,'Position',[96 46.31 74.0 7.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
    if isfield(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',[96 38.31 74.0 15.5]);
set(handles.text_output_values,'Position',[4.2 0.85 67.2 12.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)
if get(hObject,'Value')
    handles.yes = true;
    guidata(hObject,handles);
end

% --- Executes on button press in togglebutton_no.
function togglebutton_no_Callback(hObject, ~, handles)
if get(hObject,'Value')
    handles.go_on = 1;
    guidata(hObject,handles);
end
Private Nachricht senden Benutzer-Profile anzeigen
 
Marco H.
Forum-Guru

Forum-Guru


Beiträge: 404
Anmeldedatum: 12.11.10
Wohnort: Dortmund
Version: 2010a/2012b
     Beitrag Verfasst am: 23.11.2011, 09:21     Titel:
  Antworten mit Zitat      
Hey,

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)
    if get(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)

    if get(handles.togglebutton_no,'Value')
        go_on = 1;
        set(handles.togglebutton_no,'Value',false) % togglebutton zurücksetzen
    end % no
end
 


Deine function togglebutton_yes_Callback(hObject, ~, handles) und function togglebutton_no_Callback(hObject, ~, handles) sind somit auch überflüssig.

Ich hoffe, dass es dir so weiter hilft...

Greetings

Marco
Private Nachricht senden Benutzer-Profile anzeigen
 
chris4aus
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 11.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.11.2011, 05:30     Titel: DANKE
  Antworten mit Zitat      
Hallo Marco!

Ja, das hat meine Frage beantwortet! Danke, es funktioniert etzt einwandfrei.

Gruss,
Christiane
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 - 2025 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.