我在Matlab GUI代码中遇到问题。比方说,我想在控制台中显示GUI中滑块光标的值。但事实是我想实时显示它,例如在光标的每个位置,即使点击仍然打开,同时移动它。
为此,我在网上看到'addlistener'功能可以帮助我。我把它放在slider_CreateFcn函数中,如下所示:
function slider1_CreateFcn(hObject, eventdata, handles)
h=addlistener(hObject,'Value','PostSet',@(~,~)slider1_Callback)
然后,我在回调函数中添加了一个简单的disp函数,如下所示:
function slider1_Callback(hObject, eventdata, handles)
get(hObject,'value')
运行此代码会引发此错误:
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')
如果删除addlistener
函数,显然更新不再是实时更新,但我没有收到错误消息。所以我认为问题直接来自addlistener
函数。
发生了什么,我该如何解决?
答案 0 :(得分:1)
首先,您发布的代码不是产生错误的代码。我猜测产生错误的代码看起来像这样:
h = addlistener(hObject, 'Value', 'PostSet', @slider1_Callback);
在这个例子中,一个元属性作为第一个输入参数传递给slider1_Callback
,它会给你看到的即时错误。
话虽这么说,如果你想调用slider1_Callback
,你需要制作一个匿名函数,它实际上将正确的输入类型(和数量)传递给回调函数。这是一个做到这一点。
function slider1_CreateFcn(hObject, eventdata, handles)
h = addlistener(hObject, 'Value', 'PostSet', ...
@(src,evnt)slider1_Callback(hObject, [], handles))
end
更好的做法是,只使用单独的回调,而不是GUIDE为您创建的回调。这为您提供了更多的灵活性。此外,如果您只想显示该值,则不需要所有其他输入,您实际上可以内联整个回调而不是单独的函数。
h = addlistener(hObject, 'Value', 'PostSet', @(s,e)disp(get(hObject, 'Value')));
并展示它的实际效果: