我的原始脚本中有计时器,工作正常,每60秒重新运行一次脚本。
我现在使用GUIDE将相同的脚本移动到GUI中,并且我将其真正粘贴到GUIDE提供的GUI代码中,并且它工作正常。但是,当我从原始脚本中包含计时器代码时,它不起作用,每当我运行它时都会显示此错误:
??? Error using ==> axes
Invalid object handle
Error in ==>
SoftwareMonitoringToolGUI>SoftwareMonitoringToolGUI_OpeningFcn at 100
axes(handles.axes5);
Error in ==> gui_mainfcn at 221
feval(gui_State.gui_OpeningFcn, gui_hFigure, [],
guidata(gui_hFigure), varargin{:});
Error in ==> SoftwareMonitoringToolGUI at 51
gui_mainfcn(gui_State, varargin{:});
我的GUI看起来像这样,无论定时器代码是否包含在脚本中,它都保持不变,即MATLAB仍然构建它。不同之处在于,当我包含定时器代码时,MATLAB提供了上述错误:
当我只删除定时器代码时,它再次工作(但没有我需要使用定时器的刷新功能)。我的句柄是正确的,因为MATLAB在GUI窗口中生成我的数字。
定时器代码,放在GUI代码的开头:
function SoftwareMonitoringToolGUI_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
guidata(hObject, handles);
% ***TIMER FUNCTION***
%**************************************************************************
%
Period = 60; % Update period in seconds
tim = timer('Period', Period, 'ExecutionMode', 'fixedRate',...
'TimerFcn', 'SoftwareMonitoringToolGUI');
start(tim)
stop(tim)
我希望计时器每60秒刷新一次GUI。原因是每次执行脚本时都会计算新数据。想法?
答案 0 :(得分:1)
当您将字符串传递给timer
作为回调时,MATLAB
将该字符串作为可执行代码调用。那么,你在这里做什么:
tim = timer('Period', Period, 'ExecutionMode', 'fixedRate',...
'TimerFcn', 'SoftwareMonitoringToolGUI');
相当于调用
exec('SoftwareMonitoringToolGui');
或者
SoftwareMonitoringToolGui;
没有参数。你还没有提供足够的代码来确切知道发生了什么,但我猜你{gui函数的名字SoftwareMonitoringToolGui
。这意味着你的gui试图产生相同代码的不同实例,但没有传递参数。如果这不是它的工作方式,那么你就会遇到问题。
您可能想要做的是创建一个更新函数(与gui代码在同一文件中的附加函数),并将该函数的句柄传递给计时器:
tim = timer('Period', Period, 'ExecutionMode', 'fixedRate',...
'TimerFcn', @updateFcn);
答案 1 :(得分:0)
我认为,您需要将handles
数组作为参数传递给您的函数,以便更新您的GUI控件。为此,请按以下方式创建计时器:
tim = timer('Period', Period, 'ExecutionMode', 'fixedRate',...
'TimerFcn', {@SoftwareMonitoringToolGUI, handles});
要使此类计时器正常工作,您需要更新SoftwareMonitoringToolGUI
签名,如下所示:
function SoftwareMonitoringToolGUI(obj,event,handles)