Matlab GUI 回调开始和完成
Matlab GUI Callback Start and Completion
是否有通用的方法来确定 Matlab GUI 回调函数何时开始然后返回到调度程序?
我想在回调 运行 完成时锁定用户交互,并在回调 运行 时显示忙碌状态。是否有可访问的调度程序,我可以在其中插入此代码,还是必须将其放入每个回调函数中。
我知道模态 waitbar 但我想尽可能避免使用它。 (他们不能被优雅地杀死。)
您通常可以使用 waitfor
命令锁定用户交互。它旨在完全满足您的要求。
您可以让回调函数在完成时更新一个句柄 属性,这会导致 waitfor
退出。如果你正在更新的那个句柄 属性 也恰好保存了 tic / toc
操作的结果,计算你的回调函数的持续时间,那么你就是一石二鸟:)
我建议添加一个包装函数,它包装了所有原始的 UIControl 回调函数。
包装函数执行以下操作:
- 锁定(禁用)所有 GUI UIControl 对象。
- 执行原始回调函数。
- 在原始回调后启用所有 GUI UIControl returns。
您还可以在原始回调之前启动计时器,并在回调时停止计时器 returns(计时器可以使用内置于主 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)]);
是否有通用的方法来确定 Matlab GUI 回调函数何时开始然后返回到调度程序?
我想在回调 运行 完成时锁定用户交互,并在回调 运行 时显示忙碌状态。是否有可访问的调度程序,我可以在其中插入此代码,还是必须将其放入每个回调函数中。
我知道模态 waitbar 但我想尽可能避免使用它。 (他们不能被优雅地杀死。)
您通常可以使用 waitfor
命令锁定用户交互。它旨在完全满足您的要求。
您可以让回调函数在完成时更新一个句柄 属性,这会导致 waitfor
退出。如果你正在更新的那个句柄 属性 也恰好保存了 tic / toc
操作的结果,计算你的回调函数的持续时间,那么你就是一石二鸟:)
我建议添加一个包装函数,它包装了所有原始的 UIControl 回调函数。
包装函数执行以下操作:
- 锁定(禁用)所有 GUI UIControl 对象。
- 执行原始回调函数。
- 在原始回调后启用所有 GUI UIControl returns。
您还可以在原始回调之前启动计时器,并在回调时停止计时器 returns(计时器可以使用内置于主 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)]);