2016-06-29 3 views
1

Ich habe eine MATLAB-m-Datei (mainGUI.m), die eine GUI erzeugt: eine Figur, die einige uicontrol-Objekte (Drucktasten, Menüs, etc.) enthält, jede mit einer spezifischen Callback-Funktion. Wenn ich in der GUI herumklicke, funktioniert alles gut, es macht genau das, was es soll.Wenn ein Benutzer simuliert wird, um einen Callback aufzurufen, wird die Root-Eigenschaft CallbackObject nicht aktualisiert?

Jetzt habe ich eine andere m-Datei (external.m), die, wenn sie ausgeführt wird, die m-Datei oben aufruft und einen der Callbacks nachahmt (myCallbackfcn.m), als ob der Benutzer tatsächlich einen Knopf drückt . Nachfolgend finden Sie die relevanten Teile des Codes sind, die in external.m ausführt:

% Launch the GUI 
mainGUI(); 

% Obtain the handles-structure, and the handle to the pushbutton 
handles = guidata(findall(0,'type','figure')); 
hObject = handles.myPushButton; 

% Execute the callback 
myCallbackfcn(hObject,[]); 

Dies funktioniert auch in Ordnung - in der myCallbackfcn, die hObject ist in der Tat der richtige Griff, kann ich Zugriff auf die gesamte GUI Griffstruktur erhalten, und so weiter ... Aber es gibt einen Fehler, der für den Zweck meines Codes entscheidend ist. Die Root-Eigenschaft CallbackObject ist leer! Dagegen sollte es das Handle für das hObject sein, welches es ist, wenn ich den Callback manuell durch Klicken auf die Drucktaste einleite.

Hat jemand eine Idee, warum CallbackObject nicht aktualisiert wird? Es ist schreibgeschützt, also kann ich es nicht mit Gewalt ändern.

Antwort

1

Die CallbackObject des Stammobjekts ist leer, da Sie den Rückruf von einem tatsächlichen GUI-Ereignis nicht ausführen. Die CallbackObject wird automatisch von MATLAB ausgefüllt, wenn Sie mit einem GUI-Widget interagieren.

Innerhalb Ihres Rückruf, anstatt sich auf die CallbackObject unter Berufung (oder gcbo), können Sie das Objekt direkt von Ihrem handles Struktur erhalten.

myCallbackfcn(hObject, [], handles) 

function myCallbackfcn(hObject, eventdata, handles) 
    callbackObject = handles.myPushButton; 

    % Or more simply 
    callbackObject = hObject; 

    % Do stuff 
end 
+0

Dank @Suever! Der Grund, warum ich die CallbackObject-Eigenschaft aktualisieren möchte, ist, weil ich bereits Tausende von Codezeilen und Hunderte von Callback-Funktionen habe, die darauf angewiesen sind, dass gcbo nicht leer ist. Es funktioniert, solange ich die GUI manuell ausführe, aber jetzt, wo ich es remote ausführen möchte, stoße ich auch auf Probleme. Wenn es also keine einfache Möglichkeit gibt, MATLAB zu tricksen (um die CallbackObject-Eigenschaft zu ändern), muss ich das tun gehe über alle meine vorherigen Codes ... obwohl, wie du bemerkst, die Änderungen sind ziemlich klein. – ibbore

+0

@ibbore Ja, es gibt leider keine Möglichkeit, 'gcbo' oder' CallbackObject' zu setzen. Sie könnten * Ihre eigene Funktion mit dem Namen 'gcbo' schreiben, die das Objekt Ihrer Wahl zurückgeben könnte, und dann würden alle Ihre anderen Funktionen dies automatisch anstelle der eingebauten Version aufrufen. – Suever

+0

Das ist eine Idee .. obwohl ein wenig riskant (falls man später das echte gcbo braucht) Dieses Projekt wird immer größer und eines Tages muss ich es jemandem übergeben, also nehme ich es besser an Geh über meine Funktionen und ersetze die gcbo: s ... Vielen Dank für deine Kommentare, ich schätze es sehr! – ibbore

Verwandte Themen