【问题标题】:Using a variable from one figure in another figure in MATLAB GUI在 MATLAB GUI 中使用另一个图形中的一个图形中的变量
【发布时间】:2023-03-13 06:34:02
【问题描述】:

我有一个使用 GUI 布局工具箱创建的 MATLAB GUI。这个 GUI 有一个主要的图形。主要人物有一个按钮,可以调用次要人物。有一个通过主要图形调用的函数,它从次要图形访问一些变量。在代码的开头或直到打开第二个数字时,一切正常。一旦打开了辅助图形,如果我保持打开状态,函数调用就可以正常调用,但是如果我关闭辅助图形,函数调用将停止工作。

下面是我如何定义变量和函数调用的 sn-p:

S.Fig1 = figure();
S.var1 = uicontrol('parent',S.Fig1,...
                      'style','edit');
S.Fig2 = figure();
S.var2 = uicontrol('parent',S.Fig2,...
                      'style','edit');

S.var1 与函数调用 var1_call() 相关联,在该函数内部,我正在检查 S.var2 的值。 如果第二个图形是打开的,则正确提供了值,否则语句将显示错误“无效的句柄对象”

如果我无法定义这两个数字,请告诉我,如果可以,我如何检查 fig2 在打开一次后是否关闭。

谢谢

添加以下示例代码: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%% % 测试脚本以检查从主图调用新图 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%

function [] = TestCallingNewWindow()

SCR = get(0,'Screensize');  % Get screensize.

% Open Figure
S.fh = figure('numbertitle','off',...
              'menubar','none',...
              'units','pixels',...
              'position',[SCR(3)/2-800 ,SCR(4)/2-100 , 500, 200],...
              'name','TestCallingWindow',...
              'resize','off');

% Create PushButtons
S.pb1 = uicontrol('style','pushbutton',...
                  'units','pixels',...
                  'position',[20 120 200 30],...
                  'string','Open New Window',...
                  'fontsize',12);

for i=1:6
    S.Select(i) = uicontrol('parent',S.fh,...
                      'style','checkbox',...
                      'units','pixels',...
                      'position',[250 (165-((i-1)*30)) 30 20],...
                      'string',sprintf('%d',i),...
                      'enable','on',...
                      'fontsize',10);
    S.Type(i) = uicontrol('parent',S.fh,...
                      'style','text',...
                      'units','pixels',...
                      'position',[300 (165-((i-1)*30)) 60 20],...
                      'string','Data',...
                      'enable','on',...
                      'fontsize',10);
    S.TypeVal(i) = uicontrol('parent',S.fh,...
                      'style','edit',...
                      'units','pixels',...
                      'position',[365 (165-((i-1)*30)) 80 20],...
                      'string','0',...
                      'enable','on',...
                      'fontsize',10);
end

% Create the Pop-up Figure
S.popfh = figure('numbertitle','off',...
              'menubar','none',...
              'units','pixels',...
              'position',[SCR(3)/2-200 ,SCR(4)/2-100 , 300, 200],...
              'name','Pop-Up Window',...
              'resize','off',...
              'visible','off');

for i=1:6
    S.popSelect(i) = uicontrol('parent',S.popfh,...
                      'style','checkbox',...
                      'units','pixels',...
                      'position',[50 (165-((i-1)*30)) 30 20],...
                      'string',sprintf('%d',i),...
                      'enable','on',...
                      'fontsize',10);
    S.popType(i) = uicontrol('parent',S.popfh,...
                      'style','text',...
                      'units','pixels',...
                      'position',[100 (165-((i-1)*30)) 60 20],...
                      'string','Data',...
                      'enable','on',...
                      'fontsize',10);
    S.popTypeVal(i) = uicontrol('parent',S.popfh,...
                      'style','edit',...
                      'units','pixels',...
                      'position',[165 (165-((i-1)*30)) 80 20],...
                      'string','0',...
                      'enable','on',...
                      'fontsize',10);
end

% Set callback functions
set(S.Select(:),'callback',{@main_call,S})
set(S.TypeVal(:),'callback',{@main_call,S})
set(S.pb1,'callback',{@pb1_call,S}) 
set(S.popSelect(:),'callback',{@pb1_call,S})
set(S.popTypeVal(:),'callback',{@pb1_call,S})

% Function Definitions
function [] = main_call(varargin)
    [h,S] = varargin{[1,3]};  % Get calling handle and structure.
    popWin = findobj('type','figure','name','Pop-Up Window');
    for idx = 1:6
        if(~isempty(popWin))
            popenable = get(S.popSelect(idx),'Value');
        else
            popenable = 0;
        end
        if(popenable == 0)
            enable = get(S.Select(idx),'Value');
            if(enable == 1)
                data = str2double(get(S.TypeVal(idx),'String'));
                if(~isempty(popWin))
                    set(S.popTypeVal(idx),'string',data);
                end
            end
        else
            data = str2double(get(S.popTypeVal(idx),'String'));
        end
    end
end

% po-up window
function [] = pb1_call(varargin)
    [h,S] = varargin{[1,3]};  % Get calling handle and structure.

    set(S.popfh,{'visible'},{'on'});
    for idx = 1:6
        popenable = get(S.popSelect(idx),'Value');
        if(popenable == 0)
            enable = get(S.Select(idx),'Value');
            if(enable == 1)
                data = str2double(get(S.TypeVal(idx),'String'));
                set(S.popTypeVal(idx),'string',data);
            end
        else    % if popenable is 1
            data = str2double(get(S.popTypeVal(idx),'String'));
        end
    end
end

end

【问题讨论】:

    标签: matlab matlab-guide


    【解决方案1】:

    如何命名你的人物:

    S.Fig1 = figure('name','figure1');
    
    S.Fig2 = figure('name','figure2');
    

    然后你可以通过findobj找到他们:

    findobj('type','figure','name','figure2');
    

    这将在打开时返回图形句柄,如果关闭则返回空。所以这个调用将检查图形是否存在:

    ~isempty(findobj('type','figure','name','figure2'))
    

    来源:

    How to check if a figure is opened and how to close it?

    http://www.mathworks.com/help/matlab/ref/findobj.html

    http://www.mathworks.com/help/matlab/ref/isempty.html

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 所以我猜你在这条线上得到了错误:set(S.popfh,{'visible'},{'on'}); in pb1_call 如果该图如上所述关闭。因此,您应该拥有的是:

    if ~isempty(findobj('type','figure','name','Pop-Up Window'))
        set(S.popfh,{'visible'},{'on'});
    else
        S.popfh=figure('name','Pop-Up Window','Visible','on');
    end
    

    这更加健壮,并确保在尝试更改其属性之前该图是打开的。

    【讨论】:

    • 是的,这行得通,但现在我有一个后续问题。
    • 正如我提到的 Fig1 是主要图形,而 Fig2 是次要图形,当在 Fig1 上按下按钮时调用。我第一次按下 Fig1 中的按钮时,会弹出 Fig2。我通过将 Fig2 的可见属性设为 on 来实现这一点。现在假设我对 Fig2 进行了一些更改并关闭它。现在下次当我尝试使用 Fig1 上的按钮打开 Fig2 时,它不会打开。原因是 S.Fig2 句柄对象无效。我的问题是从主要图形打开图形的正确方法是什么,以便可以多次打开和关闭
    • 你不能只使用h=figure('name','figure2')。那应该会打开一个新的数字。所以你会有一个if figure2exists(正如我们上面谈到的)将焦点切换到图2并用它做一些事情elseS.Fig2=figure('name','figure2')
    • 不确定我是否理解。为什么我们同时定义 h 和 S.Fig2
    • 我添加了示例代码来显示我面临的问题
    【解决方案2】:

    我不确定我是否理解您的问题。 我认为您将在函数之间传递一些变量。如果是这样,您必须使用“guidata”功能。 例如:您在某个回调函数(命名为 MyFunc1)中读取了一些数据(我们将其命名为 DATA),并希望在另一个函数中使用它。如果是这样,您必须在导出函数的末尾添加这两行代码:

    function MyFunc1_Callback(hObject, eventdata, handles)
    %
    % BODY OF YOUR FUNCTION WHICH CREATES "DATA" VARIABLE
    %
    
    
    % attach DATA to handles structure
    handles.DATA = DATA;
    % Update handles structure
    guidata(hObject,handles);
    

    然后在另一个函数中,您可以使用存储在“句柄”结构中的 DATA:

    function MyFunc2_Callback(hObject, eventdata, handles)
    data = handles.DATA;
    ...
    

    【讨论】:

      【解决方案3】:

      我找到了我的问题的答案。 我必须分别定义两个数字的 CloseRequestFcn,这样我就能够控制我的所有要求

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多