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 und callback

 

Sigggi
Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 27.01.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.09.2012, 15:48     Titel: GUI und callback
  Antworten mit Zitat      
Hallo,

ich erstelle gerade die erste GUI mit 2 Buttons und habe zwei Fragen:

1. Der erste Button ruft eine callback - Funktion auf; leider tut er das erst, wenn man das zweite Mal draufdrückt. Wahrscheinlich kennt Matlab die Funktion da noch nicht. Kann man das irgendwie verändern?

2. Der zweite Button soll die GUI schließen. Dafür deaktiviert er den 1. Button und schließt die Anwendung; die callback-Funktion wird jedoch weiter ausgeführt und erzeugt entsprechend eine Fehlermeldung.

Das ist der Code (der Teil mit den Buttons):

Code:

% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
   
% hObject    handle to pushbutton1 (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 pushbutton1

set(hObject,'style','togglebutton','string','Stop','callback',@do_something)

% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

set(handles.pushbutton1, 'String', 'Start','Value',0);

delete(gcbf)
 


Die callback-funktion:

Code:

function do_something(obj,cancel)

if ishandle(obj);
    set(obj,'String',setxor({'Stop' 'Start'},get(obj,'String')))
    t = 0:0.1:4.5;
        while strcmp('Stop',get(obj,'String'));
            t = t+4.5;
            plot(sin(2*pi*t));
            pause(1);
        end
end
 


Ich habe bereits das Forum durchsucht, jedoch ohne Erfolg.

Gruß, Sigggi.
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 06.09.2012, 08:55     Titel: Re: GUI und callback
  Antworten mit Zitat      
Hallo Sigggi,

Das ist eine verblüffend indirekte Programm-Struktur. Der Callback des Push-Buttons ändert den Typ des UICONTROLs in einen Toggle-Button und ändert den Callback. Wieso erstellst Du das UICONTROL nicht gleich als Toggle-Button mit dem richtigen Callback? Das wäre doch deutlich einfacher.

Der zweite Push-Button löst den Callback des ersten aus, indem er die Eigenschaft 'Value' neu setzt. Wieso ruft die Funktion pushbutton2_Callback nicht direkt den gewünschten Code auf?

Das Updaten des Diagramms würde ich per TIMER lösen. Dann hättest Du einen Button, der den TIMER startet, dieser kümmert sich dann um die Grafik, und der zweite Button stoppt ihn wieder (oder halt der geänderte erste Button).

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 46
Anmeldedatum: 27.01.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.09.2012, 10:57     Titel:
  Antworten mit Zitat      
Hallo Jan,

vielen Dank für Deine Hilfe.

Jetzt sehen die Buttons so aus:

Code:

function tooglebuttonStopStart_Callback(hObject, eventdata, handles)
% Handle für den Timer
global TimerObject    

% Beschriftung umschalten
set(hObject,'String',setxor({'Stop' 'Start'},get(hObject,'String')))

% Ist das Objekt zum Handle noch gültig?
if isvalid(TimerObject) == 0;
    TimerObject = timer('TimerFcn',@do_something, 'ExecutionMode', 'fixedRate');
end

% Timer starten/stoppen
if get(hObject,'Value') == 1;
    start(TimerObject);
else
    stop(TimerObject);
end

% --- Executes on button press in pushbuttonBeenden.
function pushbuttonBeenden_Callback(hObject, eventdata, handles)
global TimerObject    
stop(TimerObject)
delete(gcbf)
 


Und die Funktion do_something:
Code:

function do_something(obj, event, arg)

t = 0:0.1:4.5;
while strcmp('on',get(obj,'Running'));
    t = t+4.5;
   plot(sin(2*pi*t));
   pause(1);
end

end
 


Das funktioniert super, vielen Dank.

Gruß, Siggi.
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 06.09.2012, 12:46     Titel:
  Antworten mit Zitat      
Hallo Sigggi,

Ja! So sieht das klar und effizient aus. Einerseits läuft das Programm, andererseits läßt sich der GUI-Teil nun viel leichter vom Visualisierungsteil trennen, falls mal der Bedarf entsteht.

Die Lösung dann noch im Forum zu posten ist hilfreich für alle, die in Zukunft ähnliche Probleme haben. Prima!

Gruß, Jan
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.