【问题标题】:Displaying analytical results in a MATLAB GUI在 MATLAB GUI 中显示分析结果
【发布时间】:2010-11-01 03:29:35
【问题描述】:

我的问题是:我有一个 MATLAB GUI,如果我运行它,我希望得到的分析结果出现在我的 GUI 而不是命令窗口中。由于为列表框自动创建的滑块,我尝试使用列表框来显示结果,但它不起作用。如何显示数据,也许使用静态文本框?

【问题讨论】:

    标签: matlab user-interface display


    【解决方案1】:

    首先,您必须确保将任何输出抑制到命令窗口。为此,您可以确保以semicolon 结束行,避免使用DISP 函数显示数据,并避免使用FPRINTF 函数将数据发送到标准输出(即命令窗口)。

    其次,确定您想要显示的“结果”类型。如果它是数值的向量或矩阵,您可能希望使用 UITABLE 对象而不是静态文本框(如 Azim's answer to your other question 中所建议的那样,并假设您拥有较新版本的 MATLAB 之一)。如果它只是几个数值、字符或字符串,那么我建议使用静态文本框。例如:

    hList = uicontrol('Style','text','Position',[100 100 200 200]);
    set(hList,'String',{'Line 1'; 'Line 2'});  % Displays 2 lines, one string each
    vec = rand(3,1);  % Column array of 3 random values
    set(hList,'String',num2str(vec));  % Displays 3 lines, one number per line
    

    使用此选项,您最终可能会使用string operations 做很多事情。

    注意:对于静态文本框,如果您在其中放置的文本超出了它们能够显示的范围,它们只会截断文本。他们不会自动创建滑块来查看整段文本。您将不得不使静态文本框更大,将静态文本框的"FontSize" property 调整为更小的值,或者(更复杂的选项)创建自己的滑块来调整文本框中显示的内容。


    编辑:更复杂的选项...

    如果有人感兴趣,我想我会包含一些示例代码,用于制作带有滑块的静态文本框,该滑块控制文本框中显示的内容。有很多不同的方法可以做到这一点,从我能想到的最简单的实现(如下所示)到使用 nested functionsfancy OOP stuff 的更复杂的版本。

    首先,您必须将以下两个函数保存为 m 文件:

    callback_scrolltext.m

    function callback_scrolltext(source,event,hText)
      textString = get(hText,'UserData');
      nLines = numel(textString);
      lineIndex = nLines-round(get(source,'Value'));
      set(hText,'String',textString(lineIndex:nLines));
    end
    

    update_scrolltext.m

    function update_scrolltext(newText,hText,hSlider)
      newText = textwrap(hText,newText);
      set(hText,'String',newText,'UserData',newText);
      nRows = numel(newText);
      if (nRows < 2),
        sliderEnable = 'off';
      else
        sliderEnable = 'on';
      end
      nRows = max(nRows-1,1);
      set(hSlider,'Enable',sliderEnable,'Max',nRows,...
          'SliderStep',[1 3]./nRows,'Value',nRows);
    end
    

    其次,使用以下代码创建 GUI 对象。您可以将“位置”属性设置为任何您想要的,以及使用图形或面板对象的任何句柄来代替 hParent

    hParent = figure;
    hText = uicontrol('Style','text',...
                      'Parent',hParent,...
                      'Units','pixels',...
                      'Position',[100 100 100 40]);
    hSlider = uicontrol('Style','slider',...
                        'Parent',hParent,...
                        'Units','pixels',...
                        'Position',[200 100 10 40],...
                        'Enable','off',...
                        'Callback',{@callback_scrolltext,hText});
    

    最后,每次要更改文本框的文本时,调用 update_scrolltext 并使用要显示的文本(包含在单元格数组中,就像输入到 TEXTWRAP 的字符串一样) 以及文本框和滑块的句柄。以下是一些可以尝试的示例:

    update_scrolltext({'hello'},hText,hSlider);
    update_scrolltext({'hello'; 'there'; 'silly'; 'world'},hText,hSlider);
    

    按照您认为合适的方式修改代码并尽情享受! =)

    【讨论】:

    • 您能否建议如何防止以前输入的文本在拨打update_scrolltext() 的新电话时消失?换句话说,如何修改上面的代码以在新行上显示新文本,并在其上方显示先前的文本?谢谢。
    • @Pupil 在update_scrolltext 的开头添加这个,它应该添加而不是覆盖:oldText = get(hText, 'UserData'); newText = [oldText; newText];
    • 非常感谢新手!
    【解决方案2】:

    我使用列表框来显示命令输出就好了。我发现滚动条可以更好地查看输出而不会造成混乱。

    假设status是样式为listbox的uicontrol的句柄;

    message = 'New output to be appended';
    set(status,'String', [message; get(status,'String')]);
    

    为此,我猜 uicontrol 的初始字符串应该是一个单元格,而不是一个字符串。您可以通过在两行上将 uicontrol 的字符串设置为“Ready”来确保这一点,或者您可以将字符串强制转换为这样的单元格:

    set(status,'String', [message; {get(status,'String')}]);
    

    【讨论】:

    • 还有一件事,如果您在代码运行期间更新 GUI,更改可能不会立即可见。在这种情况下使用“drawnow”来强制重绘 GUI。
    【解决方案3】:

    我通常只是在其中使用图形和文本,例如

    figure(gcf)
    text(offsetX1, offsetX1, ['result 1: ' num2str(result1)])
    text(offsetX2, offsetX2, ['result 2: ' num2str(result2)])
    

    现在我确信有更好的方法,但它对我来说效果很好, 即使您必须手动设计布局细节。

    【讨论】:

      【解决方案4】:

      我刚开始使用 Matlab Gui,所以我绝不是任何专家,甚至没有经验 - 但是有人在另一个论坛中提到编辑文本元素会自动生成滚动条?我相信它还具有可选择和可复制的附加优势。我即将找出,如果我能找出我的代码。等我知道了再回帖。

      【讨论】:

      • 确实如此。当我想要滚动条和可选文本时,我也会使用“编辑”uicontrols。
      猜你喜欢
      • 2010-10-21
      • 1970-01-01
      • 2021-09-01
      • 2012-06-08
      • 2020-04-20
      • 1970-01-01
      • 2017-12-25
      • 2021-10-22
      • 1970-01-01
      相关资源
      最近更新 更多