2016-08-09 185 views
0

Ich versuche, eine einfache "Durchsuchen" -Schaltfläche auf einer Matlab (R2016a) GUI zu erstellen. Mein Code ist so etwas wie:Die Verwendung von uigetdir als Callback für eine Drucktaste stürzt aufgrund von seltsamen, ungültigen Argumenten ab

hd = dialog; 
hb = uicontrol('parent',hd,'style','pushbutton','string','browse',... 
'callback',@uigetdir); 

Die Callback-Funktion uigetdir hat zwei optionale Argumente STARTPATH, TITLE. Im Prinzip könnte ich diese auf meinem Rückruf übergibt, indem Sie sie mit der Funktion Griff auf einer Zellenanordnung, wie

hd = dialog; 
hb = uicontrol('parent',hd,'style','pushbutton','string','browse',... 
'callback',{@uigetdir,'myStartPath','myTitle'); 

Ob meine Schaltfläche Durchsuchen ruft uigetdir mit oder ohne die optionalen Argumente verketten, wird es zum Absturz bringen. Verschiedene Fehler, aus dem gleichen Grund: uicontrol beschließt, 2 uncalled-for, seltsame Variablen (die UI-Eigenschaften enthalten) als Argumente für die Callback-Funktion einzuschließen, und uigetdir weiß nicht, was mit ihnen zu tun ist.

Bedeutet dies, dass ich uigetdir (oder so ziemlich jede andere eingebaute Funktion) nicht als Callback-Funktion in einer GUI verwenden kann? Es muss eine Lösung neben dem Schreiben einer benutzerdefinierten Funktion geben, nein?

+1

I [die Dokumentation für Rückrufe] schlagen vor, zu lesen (http://www.mathworks.com/help/matlab/creating_guis/write-callbacks-using-the-programmatic-workflow.html#f16-1001315) – excaza

+1

Wirklich? Aus der Dokumentation: "Die Funktionsdefinition muss zwei Eingabeargumente definieren,' hObject' und 'callbackdata'. Handle Graphics® übergibt' hObject' und 'callbackdata' beim Aufruf der Funktion automatisch." – excaza

+1

Auch aus der Dokumentation: "Hinweis: Wenn Sie eine vorhandene Funktion verwenden möchten, die die Argumente' hObject' und 'callbackdata' nicht unterstützt, können Sie sie als anonyme Funktion angeben. Zum Beispiel' uicontrol ('Style' , 'slider', 'Callback', @ (hObject, callbackdata) myfunktion (x); '" – excaza

Antwort

4

Standardmäßig werden alle uicontrol Objekte werden zwei Eingangs Argumente übergeben:

  • Der uicontrol Griff selbst
  • Ein Objekt spezifische Informationen für das Ereignis enthält.

Wenn Sie einen Rückruf definieren einfach durch @ zu einem Funktionsnamen Anfügen eines Funktionsgriff, diese beiden Argumente automatisch an die Funktion übergeben werden zu erstellen.

Sie können stattdessen Ihre anonyme Funktion erstellen, um zwei Eingabeargumente zu akzeptieren, und uigetdir ohne Eingabeargumente aufrufen, wodurch die standardmäßigen Rückrufeingaben ignoriert werden.

set(hb, 'Callback', @(s,e)uigetdir()) 

Wenn Sie einen Startpfad übergeben möchten und einen Titel, den Sie diejenigen uigetdir aus der anonymen Funktion übergeben können.

set(hb, 'Callback', @(s,e)uigetdir('mystartpath', 'mytitle'))