【问题标题】:Communication between two separate GUIs两个独立 GUI 之间的通信
【发布时间】:2012-07-21 16:01:40
【问题描述】:

所以,我想出了如何从另一个 gui 调用一个 gui 并通过 varargin 和 varargout 来回发送信息。但是,现在我的情况是我有两个单独的 gui(一个不从另一个调用),我相信如果我想在它们之间进行通信,我需要一些其他方法。

更准确地说,我正在制作两个与 Simulink 交互的 GUI。打开模型时会打开一个 GUI,并跟踪信息。双击一个块时将打开另一个 GUI。我想从这个 GUI 向信息跟踪 GUI 发送信息。

因此,根据我的搜索,我可以通过在信息跟踪 GUI 中使用 Listener 来完成此操作;或者我可以直接使用setappdata/getappdatafindall(0, ...) 修改信息跟踪GUI 中的变量。

到目前为止,我的尝试还没有奏效,我想知道我是否正在采用写入方法。有人可以指点我一个方向吗?如果我能提供更多信息,请告诉我!

【问题讨论】:

    标签: matlab user-interface simulink matlab-figure matlab-guide


    【解决方案1】:

    我一直使用 setappdata/getappdata 方法来处理这类事情。这是您所做工作的一般分类。当你创建人物时,给他们一个这样的标签:

    figure( ..., 'Tag', 'info_gui', ... ); % tag name is up to you
    figure( ..., 'Tag', 'other_gui', ... ); % tag name is up to you
    

    只要您需要一个或其他图形的句柄,只需像这样调用 findobj 即可

    info_gui_handle = findobj('tag','info_gui');
    other_gui_handle = findobj('tag','other_gui');
    

    好的,现在让我们在 info_gui 中存储一些示例数据,我们稍后会更新

    info_gui_data.x = 1;
    info_gui_data.y = 1;
    setappdata( info_gui_handle, 'info_gui_data', info_gui_data);
    

    设置好人物后,您可以执行以下操作:

    % First you get a handle to the info gui figure
    
    info_gui_handle = findobj('tag','info_gui');
    
    % Next you get the appdata thats stored in this figure.  In this example
    % I have previously stored a struct variable called 
    % 'info_gui_data' inside the appdata of the info_gui
    
    info_gui_data = getappdata(info_gui_handle ,'info_gui_data');
    
    % Make your changes whatever they are.  Here I am modifying variables x 
    % and y that are stored in the struct info_gui_data
    
    info_gui_data.x = 2;
    info_gui_data.y = 2;
    
    % Now that I've made changes to the local variable info_gui_data I can 
    % now store it back into the info gui's appdata.
    
    setappdata(info_gui_handle ,'info_gui_data',info_gui_data);
    

    我喜欢将我所有的图形应用数据存储在一个巨大的结构中。似乎更容易跟踪,但这取决于您。希望这会有所帮助:)

    【讨论】:

      【解决方案2】:

      您也可以尝试使用guidataguihandles

      假设 GUI1 的句柄是 H1。在 GUI1 中,当您想要存储以后可以检索的数据时,请使用:

      guidata(H1,data)
      

      在 GUI2 中,当您需要数据时,使用:

      data = guidata(H1);
      

      或者,您可以将数据存储在 uicontrol 对象的“用户数据”属性中。确保将属性“标签”设置为有效的(例如“mybutton”)。要从 GUI2 访问它,请使用:

      handles = guihandles(H1);
      data = get(handles.mybutton,'UserData');
      

      【讨论】: