我是函数中的嵌套函数,我正在从基本工作区调用变量。请注意,guiel
位于基本工作区中。
function callback(~,~)
vars.dropheight = str2num(get(edit(2),'String'));
vars.armradius = str2num(get(edit(1),'String'));
kiddies = get(guiel.hAX(3),'Children');
delete(kiddies);
clear kiddies;
set(guiel.tfPanel,'Visible','off','Position',cnst.tfPanelpos);
set(guiel.hAX(1),'Position',cnst.axpos1);
if ishandle(guiel.hAX(2))
set(guiel.hAX(2),'Position',cnst.axpos2);
end
eval(get(guiel.hPB(4),'Callback'));
end
,最好的方法是将guiel
存储到 guidata 中。
guidata(hFig, guiel); % hFig can be gcf for top figure
并通过以下方式callback
访问它
guiel = guidata(hFig);
一种替代方法是将变量作为输入传递给callback
,方法是将其定义为
{@callback, guiel}
回调函数定义将是
function callback(~, ~, guiel)
如果您真的讨厌这些方法,一个简单的方法是在base
和callback
中将其定义为全局。但出于性能和代码可维护性的考虑,这是人们试图避免的事情。
GUI 设计的最佳实践是封装 GUI 及其操作,使其永远不必依赖于基本工作区即可正常运行。原因何在?用户和其他程序可以修改基本工作区中的任何内容,因此可以轻松破坏您的 GUI。
我在这篇文章中给出了一个使用嵌套函数的基本 GUI 设置示例。下面是设计 GUI 的一般框架:
function create_GUI()
% Initialize data:
data1 = ...;
data2 = ...;
% Create GUI:
hFigure = figure;
hObject1 = uicontrol(..., 'Callback', @callback1);
hObject2 = uicontrol(..., 'Callback', @callback2);
....
function callback1(~, ~)
% Access any data or handles from above
...
end
function callback1(~, ~)
% Access any data or handles from above
...
end
end
这个想法是 main 函数创建所有 GUI 组件,初始化所有需要的数据和对象句柄。嵌套在 main 函数中的回调将有权根据需要访问数据和句柄。我建议像这样设计您的 GUI,或使用此处列出的其他选项之一。这应该可以缓解一些数据访问问题,并使 GUI 更加健壮。