preposition "Erreur lors de l'utilisation de get" à l'aide d'une fonction 'addlistener' dans l'interface graphique de Matlab



phrasal verbs avec get (1)

J'ai un problème avec un code GUI Matlab. Disons par exemple que je veux afficher dans la console la valeur d'un curseur dans l'interface graphique. Mais le fait est que je veux l'afficher en temps réel, par exemple à chaque position du curseur même si le clic est toujours activé, tout en le déplaçant.

Pour cela, j'ai lu sur internet que la fonction 'addlistener' pouvait m'aider. Je l'ai mis dans la fonction slider_CreateFcn comme ceci:

function slider1_CreateFcn(hObject, eventdata, handles)
   h=addlistener(hObject,'Value','PostSet',@(~,~)slider1_Callback)

Ensuite, j'ai ajouté une fonction de disp simple dans la fonction de rappel, comme ceci:

function slider1_Callback(hObject, eventdata, handles)
    get(hObject,'value')

L'exécution de ce code déclenche cette erreur:

Warning: Error occurred while executing callback:
Error using get
Cannot find 'get' method for matlab.graphics.internal.GraphicsMetaProperty class.

Error in untitled>slider1_Callback (line xx)
get(hObject,'value')

Si je supprime la fonction addlistener , évidemment la mise à jour n'est plus en temps réel, mais je ne reçois pas le message d'erreur. Donc je pense que le problème vient directement de la fonction addlistener .

Que se passe-t-il et comment puis-je le réparer?


Answer #1

Tout d'abord, le code que vous avez publié n'est pas le code qui génère votre erreur. Je devine que le code qui a généré votre erreur ressemblait à ceci:

h = addlistener(hObject, 'Value', 'PostSet', @slider1_Callback);

Dans ce cas, une propriété meta est transmise comme premier argument d'entrée à slider1_Callback qui vous donne l'erreur immédiate que vous voyez.

Cela dit, si vous voulez appeler slider1_Callback vous devez créer une fonction anonyme qui transmet le type (et le nombre) d'entrées à la fonction de rappel. Voici celui qui fait cela.

function slider1_CreateFcn(hObject, eventdata, handles)
    h = addlistener(hObject, 'Value', 'PostSet', ...
                    @(src,evnt)slider1_Callback(hObject, [], handles))
end

La meilleure chose à faire est de simplement utiliser un rappel séparé plutôt que celui que GUIDE crée pour vous. Cela vous donne un peu plus de flexibilité. En outre, si vous voulez simplement afficher la valeur, vous n'avez pas besoin de toutes les autres entrées et vous pouvez réellement aligner le rappel entier plutôt que d'avoir une fonction séparée.

h = addlistener(hObject, 'Value', 'PostSet', @(s,e)disp(get(hObject, 'Value')));

Et pour le montrer en action: