在MATLAB GUI中显示分析结果

3

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

4个回答

8

首先,您需要确保抑制任何输出到命令窗口。您可以通过确保使用semicolon结束行来实现此目的,避免使用DISP函数显示数据,并避免使用FPRINTF函数将数据发送到标准输出(即命令窗口)。

第二步,确定您想要显示什么样的“结果”。如果它是一组数字值的向量或矩阵,则可能需要使用UITABLE对象而不是静态文本框(如Azim在您其他问题的答案中建议的那样,假设您有较新版本的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

使用此选项,您可能会处理很多 字符串操作注意: 对于静态文本框,如果您在其中放置的文本超过其显示能力,它们将简单地截断文本。 它们不会自动创建滑块以查看整个文本。 您可以扩大静态文本框,调整静态文本框的"FontSize"属性为较小的值,或者(更复杂的选项)创建自己的滑块,以调整文本框中显示的内容。

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

如果有人感兴趣,我想包含一些示例代码,用于创建一个静态文本框和一个滑块,该滑块控制在文本框中显示的内容。有很多不同的方法可以做到这一点,从我能想到的最简单的实现(如下所示)到使用嵌套函数高级OOP技术的更复杂版本。

首先,您必须将以下两个函数保存为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对象。您可以将“Position”属性设置为任何您想要的值,并且可以使用任何图形或面板对象的句柄来代替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});

最后,每次想要更改文本框的文本时,请使用包含所需显示文本的单元数组(与输入到TEXTWRAP的字符串相同)以及文本框和滑块的句柄调用update_scrolltext。以下是一些示例:

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

根据您的需要修改代码并享受!=)


您能否建议如何防止每次调用update_scrolltext()时,先前输入的文本消失?换句话说,我该如何修改上述代码以在新行上显示新文本,并将先前的文本置于其上方?谢谢。 - user238469
1
@Pupil 在 update_scrolltext 的开头添加以下内容,它应该会添加而不是覆盖:oldText = get(hText, 'UserData'); newText = [oldText; newText]; - gnovice

2
我使用列表框很好地显示了命令输出。我发现滚动条可以在不混乱的情况下更好地查看输出内容。
假设"status"是具有列表框样式的UI控件的句柄;
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。 - ustun

1

我通常只是使用一个图形并在其中添加文本,例如:

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

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


0
我刚开始学习Matlab Gui,所以我绝不是任何专家或有经验的人-但是有人在另一个论坛中提到edit-text元素会自动生成滚动条?它还具有可选择和可复制的额外优点。如果我能理解我的代码,我将找出来,并在了解后再发帖。

1
没错。当我需要滚动条和可选择文本时,我也使用“编辑”控件。 - tashuhka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接