Verfasst am: 05.09.2012, 15:48
Titel: GUI und callback
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
% --- 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)
Verfasst am: 06.09.2012, 08:55
Titel: Re: GUI und callback
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).
% Ist das Objekt zum Handle noch gültig? if isvalid(TimerObject) == 0;
TimerObject = timer('TimerFcn',@do_something, 'ExecutionMode', 'fixedRate');
end
% Timer starten/stoppen ifget(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)
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
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.