GUIData 未正确更新
GUIData not updating properly
我在 MATLAB 中有一个 GUI,其中包含一个计时器。我希望每次调用计时器时将索引递增 1,并将其存储在 guidata 中。如果需要,我希望功能可以倒退,因此仅使用 TasksExecuted 字段是行不通的。我的问题是索引根本不会增加。这是定时器的声明
handles.index= 1 ;
handles.timer = timer(...
'ExecutionMode', 'fixedRate', ... % Run timer repeatedly
'Period', 1, ... % Initial period is 1 sec.
'TimerFcn', {@update_display,hObject,handles}); % Specify callback
这是函数的相关部分。
function update_display(hObject,eventdata,hfigure,handles)
tin = evalin('base','t_in');
curtime = tin.time(handles.index);
fprintf('%f',handles.index);
index = handles.index;
...
handles.index = index+1
guidata(handles.figure1,handles);
调试语句表明索引在函数末尾始终为 2。我在这里做错了什么?
谢谢。
向回调函数提供输入变量时,调用回调时传递的变量是定义回调时存在的变量。你可以通过一个简单的例子看到这一点:
function testcode
handles.mainwindow = figure();
handles.idx = 1;
handles.button1 = uicontrol('Style','pushbutton', 'String', 'Button1', ...
'Units','normalized', 'Position', [0.05 0.05 .30 .90], ...
'Callback', {@button, handles} ...
);
handles.button2 = uicontrol('Style','pushbutton', 'String', 'Button2', ...
'Units','normalized', 'Position', [0.35 0.05 .30 .90], ...
'Callback', {@button, handles} ...
);
handles.button3 = uicontrol('Style','pushbutton', 'String', 'Button3', ...
'Units','normalized', 'Position', [0.65 0.05 .30 .90], ...
'Callback', {@button, handles} ...
);
end
function button(hObj,~,handles)
fprintf('Initial idx: %u\n', handles.idx);
handles.idx = handles.idx + 1;
guidata(hObj, handles);
tmp = guidata(hObj);
fprintf('Stored idx: %u\n', tmp.idx);
end
按下每个按钮并检查显示的输出。
为了解决这个问题,您可以利用 update_display
中的 guidata
来获取和存储您的 handles
结构,而不是显式传递它:
handles.index = 1;
handles.timer = timer( ...
'ExecutionMode', 'fixedRate', ... % Run timer repeatedly
'Period', 1, ... % Initial period is 1 sec.
'TimerFcn', {@update_display,hObject}); % Specify callback
guidata(handles.figure1, handles);
和
function update_display(hObject,eventdata,hfigure)
handles = guidata(hfigure);
guidata(handles.figure1, handles);
tin = evalin('base','t_in');
curtime = tin.time(handles.index);
fprintf('%f',handles.index);
index = handles.index;
% ... do things
handles.index = index+1
guidata(handles.figure1,handles);
如果这是 GUIDE GUI,修改 handles
结构可能会产生意想不到的后果。我建议改用 setappdata
and getappdata
:
setappdata(hObject, 'index', 1); % Assuming hObject is your figure window
handles.timer = timer(...
'ExecutionMode', 'fixedRate', ... % Run timer repeatedly
'Period', 1, ... % Initial period is 1 sec.
'TimerFcn', {@update_display,hObject}); % Specify callback
和
function update_display(hObject,eventdata,hfigure)
index = getappdata(hfigure, 'index');
% ... do things
index = index + 1;
setappdata(hfigure, 'index', index);
我在 MATLAB 中有一个 GUI,其中包含一个计时器。我希望每次调用计时器时将索引递增 1,并将其存储在 guidata 中。如果需要,我希望功能可以倒退,因此仅使用 TasksExecuted 字段是行不通的。我的问题是索引根本不会增加。这是定时器的声明
handles.index= 1 ;
handles.timer = timer(...
'ExecutionMode', 'fixedRate', ... % Run timer repeatedly
'Period', 1, ... % Initial period is 1 sec.
'TimerFcn', {@update_display,hObject,handles}); % Specify callback
这是函数的相关部分。
function update_display(hObject,eventdata,hfigure,handles)
tin = evalin('base','t_in');
curtime = tin.time(handles.index);
fprintf('%f',handles.index);
index = handles.index;
...
handles.index = index+1
guidata(handles.figure1,handles);
调试语句表明索引在函数末尾始终为 2。我在这里做错了什么?
谢谢。
向回调函数提供输入变量时,调用回调时传递的变量是定义回调时存在的变量。你可以通过一个简单的例子看到这一点:
function testcode
handles.mainwindow = figure();
handles.idx = 1;
handles.button1 = uicontrol('Style','pushbutton', 'String', 'Button1', ...
'Units','normalized', 'Position', [0.05 0.05 .30 .90], ...
'Callback', {@button, handles} ...
);
handles.button2 = uicontrol('Style','pushbutton', 'String', 'Button2', ...
'Units','normalized', 'Position', [0.35 0.05 .30 .90], ...
'Callback', {@button, handles} ...
);
handles.button3 = uicontrol('Style','pushbutton', 'String', 'Button3', ...
'Units','normalized', 'Position', [0.65 0.05 .30 .90], ...
'Callback', {@button, handles} ...
);
end
function button(hObj,~,handles)
fprintf('Initial idx: %u\n', handles.idx);
handles.idx = handles.idx + 1;
guidata(hObj, handles);
tmp = guidata(hObj);
fprintf('Stored idx: %u\n', tmp.idx);
end
按下每个按钮并检查显示的输出。
为了解决这个问题,您可以利用 update_display
中的 guidata
来获取和存储您的 handles
结构,而不是显式传递它:
handles.index = 1;
handles.timer = timer( ...
'ExecutionMode', 'fixedRate', ... % Run timer repeatedly
'Period', 1, ... % Initial period is 1 sec.
'TimerFcn', {@update_display,hObject}); % Specify callback
guidata(handles.figure1, handles);
和
function update_display(hObject,eventdata,hfigure)
handles = guidata(hfigure);
guidata(handles.figure1, handles);
tin = evalin('base','t_in');
curtime = tin.time(handles.index);
fprintf('%f',handles.index);
index = handles.index;
% ... do things
handles.index = index+1
guidata(handles.figure1,handles);
如果这是 GUIDE GUI,修改 handles
结构可能会产生意想不到的后果。我建议改用 setappdata
and getappdata
:
setappdata(hObject, 'index', 1); % Assuming hObject is your figure window
handles.timer = timer(...
'ExecutionMode', 'fixedRate', ... % Run timer repeatedly
'Period', 1, ... % Initial period is 1 sec.
'TimerFcn', {@update_display,hObject}); % Specify callback
和
function update_display(hObject,eventdata,hfigure)
index = getappdata(hfigure, 'index');
% ... do things
index = index + 1;
setappdata(hfigure, 'index', index);