如何在以编程方式创建的GUI中关闭Matlab中的所有窗口?

时间:2013-07-22 18:04:16

标签: matlab user-interface

我有两个窗口'父母'和'孩子'。我想按下'父'GUI中的关闭按钮,关闭两个窗口'父母'和'孩子'。

我的回调函数是下一个:

function close(hObject, eventdata)
    close all;
end

'figure'对象的代码是:

set(hMainFigure, 'deletefcn', @close);

两个窗口都关闭了,但我收到了下一个错误:

Maximum recursion limit of 500 reached. Use set(0,'RecursionLimit',N)
to change the limit.  Be aware that exceeding your available stack space can
crash MATLAB and/or your computer.

Error in main/close

Error using delete
Error while evaluating figure DeleteFcn

我的第二个选项是相同的:

function close(hObject, eventdata)
    close(hParentFigure);
    close(hChildFigure);
end

我想知道错误被触发的原因?

注意:每个GUI都在不同的文件上编程。我没有使用GUIDE。

2 个答案:

答案 0 :(得分:3)

可以使用

重现此问题
f = figure;
set(f, 'deletefcn', @(src, evt)close('all'))
close all

但是,在2013a中,您会收到更多信息

Warning: A callback recursively calls CLOSE.  Use DELETE to prevent this message. 
> In /Applications/MATLAB_R2013a.app/toolbox/matlab/graphics/close.p>request_close_helper at 167
  In /Applications/MATLAB_R2013a.app/toolbox/matlab/graphics/close.p>request_close at 253
  In /Applications/MATLAB_R2013a.app/toolbox/matlab/graphics/close.p>close at 124
  In @(src,evt)close('all')
  In closereq at 18
  In /Applications/MATLAB_R2013a.app/toolbox/matlab/graphics/close.p>request_close at 256
  In /Applications/MATLAB_R2013a.app/toolbox/matlab/graphics/close.p>close at 124 

可能发生的事情是,当您致电close all时,该功能会尝试使用自定义delete调用图上的deletefcn。由于该数字尚未结束,执行deletefcnclose all会再次尝试删除相同的数字,依此类推。

答案 1 :(得分:3)

按下“父”图上的关闭按钮后,它已经关闭。无需再次关闭它。在第二个实现中,(没有“全部关闭”的实现),请尝试删除close(hParentFigure);行。

正如@Huguenot已经指出的那样,这个递归限制是由窗口关闭活动重新触发窗口关闭活动触发的。


错误详细错误消息中建议使用更强大的建议。只需使用delete代替。这是一些演示代码:

deleteAllFigures = @(~, ~) delete(findobj(0,'type','figure'));    
for ix = 1:4
    h = figure;
    set(h,'DeleteFcn',deleteAllFigures);
end
%Now press the close box on any of the figures.