Отображение аналитических результатов в MATLAB GUI - PullRequest
3 голосов
/ 08 июня 2009

Моя проблема заключается в следующем: у меня есть графический интерфейс MATLAB, и я хочу, чтобы результаты анализов, которые я получаю, запускались так, чтобы они отображались в моем графическом интерфейсе, а не в командном окне. Я попытался использовать список для отображения результатов из-за ползунков, которые автоматически создаются для списка, но это не сработало. Как я могу отобразить данные, возможно, используя статическое текстовое поле?

Ответы [ 4 ]

8 голосов
/ 08 июня 2009

Во-первых, вам нужно убедиться, что вы подавили любой вывод в командное окно. Вы можете сделать это, убедившись, что в конце строк стоит точка точка с запятой , избегайте использования функции DISP для отображения данных и избегайте использования функции FPRINTF для отправки данных на стандартный вывод (т. е. командное окно).

Во-вторых, определите, какие «результаты» вы хотите отобразить. Если это вектор или матрица числовых значений, вы можете использовать объект UITABLE вместо статического текстового поля (как это предлагается в ответ Азима на ваш другой вопрос , и предполагая, что у вас есть одна из более новых версий 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" статического текстового поля на меньшее значение, либо (более сложный вариант) создать собственный ползунок, который будет регулировать то, что отображается в текстовом поле.


РЕДАКТИРОВАТЬ: более сложный вариант ...

На случай, если кому-то будет интересно, я подумал, что я бы включил пример кода для создания статического текстового поля со слайдером, который управляет содержимым, отображаемым в текстовом поле. Есть довольно много разных способов сделать это, начиная от самой простой реализации, которую я могу себе представить (приведенной ниже), до более сложных версий, использующих вложенные функции и причудливые ООП .

Во-первых, вам нужно сохранить две следующие функции в виде 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);

Измените код так, как считаете нужным и наслаждайтесь! =) * +1061 *

2 голосов
/ 14 июня 2009

Я использую список для отображения вывода команды просто отлично. Я считаю, что полосы прокрутки делают просмотр вывода лучше без помех.

Предположим, что status это дескриптор uicontrol со стилем списка;

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

Чтобы это работало, я предполагаю, что исходная строка uicontrol должна быть ячейкой, а не строкой. Вы можете убедиться в этом, сделав строку uicontrol как 'Ready' в две строки, или вы можете привести строку к ячейке, например так:

set(status,'String', [message; {get(status,'String')}]);
1 голос
/ 08 июня 2009

Я обычно просто использую цифру и текст, например,

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

в настоящее время я уверен, что есть лучший способ, но он хорошо работает для меня, несмотря на то, что вы должны разработать детали макета вручную.

0 голосов
/ 08 октября 2010

Я только начинаю с Matlab Gui, так что я ни в коем случае не эксперт и даже не опытный, но кто-то упоминал на другом форуме, что элемент edit-text автоматически генерирует полосы прокрутки? Я также считаю, что он обладает дополнительным преимуществом возможности выбора и копирования. Я собираюсь выяснить, смогу ли я выяснить свой код. Я отправлю обратно, когда узнаю.

...