Seminář 8 KMI/PVM Programování v MATLABu

GUI

MATLAB poskytuje nástroj guide, který je schopen vygenerovat základní GUI prvky. Je vygenerován soubor fig rerezentující GUI a m-file s odpovídající funkcionalitou. V novějších verzích MATLABu je navíc k dispozici app designer. GUI lze vytvářet i programově (za běhu).

Triviální příklad

Spustíme guide a vybereme Blank GUI (defaultní). Do GUI přidáme dva edit boxy, textbox, a pushbutton. GUI uložíme jako test.fig. V editoru vygenerovaného kódu použijeme tlačítko funkce (modré F) popřípadě kontextovou nabídku (novější verze MATLABu, položka View Callbacks) pro nalezení příslušné obslužné funkce při stisku tlačítka a doplníme následující kód.
a = str2double(get(handles.edit1,'String'));
b = str2double(get(handles.edit2,'String'));
set(handles.text1,'String', num2str(a+b));

Program spustíme klasickým způsobem nebo zavoláním příkazu test (název GUI).

uicontrol objekt

Představuje hlavní objekt GUI. Většina vlastností je shodná pro všechny prvky GUI (např. position, units, tag, visible, parent, style, callback), jednotlivé prvky GUI mají navíc dodatečné (specifické) vlastnosti.

Vytvoření GUI za běhu

function tab

  % x a y souradnice leveho dolniho rohu okna, sirka a vyska okna
  f = figure('Position', [200 200 500 250]);

  % data pro tabulku
  data = [ magic(5);  magic(5)];
  data = [data, sum(data, 2)];

  % umistime tabulku
  t = uitable('Parent', f, 'Position', [5 5 490 240], 'Data', data);

  % upravime vlastnosti tabulky
  set(t,'ColumnName', {'#','col 1','col 2','col 3','col 4','sum'});

  columneditable =  [true true false false false false];
  set(t,'ColumnEditable', columneditable);

  % nastavime callback
  set(t, 'CellEditCallback', @update);

  % update callback pro tabulku
      function update(o, e)
          data = get(o, 'data');

          if isnumeric(e.NewData)
              data(e.Indices(1), end) = sum(data(e.Indices(1),1:end-1));
          else
              data(e.Indices(1), e.Indices(2)) = e.PreviousData;
              %error('Zadana mohou byt pouze cisla');
          end

          set(o, 'data', data);
      end
  end

Progress bar

iteraci = 10;
bar = waitbar(0, 'Please wait...', 'Name', 'Computation...');

for i = 1:iteraci
    pause(0.5)
    waitbar(i/10, bar, sprintf('Progress: %d/%d', i, iteraci));
end

close(bar);

Doporučená literatura na dnešní seminář

Úkoly

  1. Vytvořte umělý skript, který zobrazí dialogové okno obsahující selectbox a po výběru a potvrzení volby bude pokračovat s vybranou hodnotou.

  2. Příkazem load hospital načtěte vstupní data (data jsou v dataset formatu). Data analyzujte (poslední sloupec ingnorujte) a uložte je v jiné reprezentaci do jiného souboru. Vytvořte GUI aplikaci (tabulkova), která bude umožňovat načítání, editaci a ukládání těchto dat (včetně přidání nového záznamu).

© Martin Trnečka