0

我有两个窗口“父母”和“孩子”。我想按下“父”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 都在不同的文件上编程。我没有使用指南。

4

2 回答 2

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使用 custom 调用图形deletefcn。由于图形还没有完成关闭,deletefcn执行时close all会尝试再次删除同一个图形,以此类推。

于 2013-07-22T18:15:50.917 回答
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.  
于 2013-07-22T18:27:42.400 回答