Matlab GUI回调开始和完成

时间:2016-08-05 21:21:33

标签: matlab matlab-guide

是否有通用的方法来确定Matlab GUI回调函数何时开始然后又返回给调度程序?

我希望在回调运行完成时锁定用户交互,并在回调运行时显示忙状态。在我可以插入此代码的地方是否可以访问调度程序,或者我是否必须将其放入每个回调函数中。

我知道模态 waitbar ,但我想避免尽可能多地使用它。 (他们不能优雅地被杀死。)

2 个答案:

答案 0 :(得分:1)

我建议添加一个包装函数,它包装所有原始的UIControl回调函数 包装函数执行以下操作:

  • 锁定(禁用)所有GUI UIControl对象。
  • 执行原始回调功能。
  • 在原始回调返回后启用所有GUI UIControl。

您还可以在原始回调之前启动计时器,并在回调返回时停止计时器(计时器可以使用内置于主GUI的图像模拟等待栏[小轴内的图像])。

示例(假设GUI是使用guide工具创建的):

% --- Executes just before untitled1 is made visible.
function untitled1_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to untitled1 (see VARARGIN)

% Choose default command line output for untitled1
handles.output = hObject;

%Add wrapper function to each UIControl callback.
A = findall(hObject.Parent, 'Type', 'UIControl');
for i = 1:length(A)
    set(A(i), 'Callback', {@wrapper, A(i).Callback});
end

% Update handles structure
guidata(hObject, handles);

% UIWAIT makes untitled1 wait for user response (see UIRESUME)
% uiwait(handles.figure1);


function wrapper(ObjH, EventData, origCallback)
disp('Do somthing before callback begins...');
%You can also start a timer.

%Disable all UIControl objects, before executing original callback
A = findall(ObjH.Parent, 'Type', 'UIControl');
for i = 1:length(A)
    set(A(i), 'Enable', 'off');
end

%Execute original callback.
feval(origCallback, ObjH, EventData);

disp('Do somthing after callback ends...');
%You can also stop the timer.

%Enable all UIControl objects, after executing original callback
for i = 1:length(A)
    set(A(i), 'Enable', 'on');
end


% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
pause(1);
set(handles.pushbutton1, 'BackgroundColor', [rand(1,1), rand(1,1), rand(1,1)]);

答案 1 :(得分:0)

您通常可以使用waitfor命令锁定用户交互。它的设计完全符合您的要求。

您可以让回调函数在完成时更新句柄属性,这可能导致waitfor退出。如果你正在更新的句柄属性也恰好保持tic / toc操作的结果计时你的回调函数的持续时间,那么你就会一举两得:)