即使使用 guidata,Matlab GUIDE 回调也不会更新句柄

Matlab GUIDE callback does not update handles even when guidata is used

我正在使用 Mathworks 提供的计时器 GUIDE 回调示例作为最小工作示例。可以通过以下方式获取文件:

copyfile(fullfile(docroot, 'techdoc','creating_guis','examples',...
'ex_guide_timergui*.*')), fileattrib('ex_guide_timergui*.*', '+w') 

在 Matlab 中。 我像这样修改了示例文件:

function startbtn_Callback(hObject, eventdata, handles)
% hObject    handle to startbtn (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% START USER CODE
% Only start timer if it is not running
if strcmp(get(handles.timer, 'Running'), 'off')
    start(handles.timer);
end
handles.blip = 1;
guidata(hObject,handles);

当我在示例中单击开始按钮(并启动计时器)时,实际上是在句柄中创建 blip 字段。然后我使用 giudata 更新了 handles 的主版本……我是这么想的。

我修改了计时器回调函数来测试这个字段:

function update_display(hObject,eventdata,hfigure)
% Timer timer1 callback, called each time timer iterates.
% Gets surface Z data, adds noise, and writes it back to surface object.

handles = guidata(hfigure);
Z = get(handles.surf,'ZData');
Z = Z + 0.1*randn(size(Z));
set(handles.surf,'ZData',Z);
if handles.blip ==1
    a = 0;
end

然而,一旦我 运行 GUI 并启动计时器,MATLAB 就会抛出错误,指出 blip 不作为句柄中的字段存在(引用不存在的字段 'blip' ).当我在先前调用的回调中使用 guidata 更新句柄的主版本,然后在计时器回调中使用 guidata 检索此主版本(示例中的原始代码)时,这怎么可能?我应该有带有 blip 字段的更新版本,但我没有。一步步调试发现timer回调获取到的handles版本对应openingfunction制作的版本,少了blip字段。 我已经在这个网站上寻找这个问题的解决方案并使用 google,但没有找到解释(或只使用回调而不是函数来做到这一点的方法) - 有些函数已经成功但这里是计时器功能是什么阻止我编写一个常规函数来做同样的事情并从回调中调用它。

正如 excaza 在评论中所说:发生这种情况的原因是因为在 MATLAB 中启动定时器时会立即调用定时器函数,而不管定时器周期是多少,从而在设置之前检查值.解决方法是在启动计时器之前更改变量,更新 guidata 然后启动计时器(并最终再次更新 guidata)。