Создавание простого приложения программно

Примечание

Эта тема применяется к приложениям, создаваемым программно с помощью функции figure. Для альтернативных способов создать приложения, смотрите Способы Создать Приложения.

Этот пример показывает, как создать простое приложение программно, такой как один показанный здесь.

Последующие разделы проводят вас по процессу создавания этого приложения.

Если вы предпочитаете просматривать и запускать код, который создал это приложение, не создавая его, установите свою текущую папку на одну, к которой у вас есть доступ для записи. Скопируйте пример кода и откройте его в Редакторе путем выдачи следующих команд MATLAB®:

copyfile(fullfile(docroot, 'techdoc','creating_guis',...
  'examples','simple_gui2*.*')), fileattrib('simple_gui2*.*', '+w');
edit simple_gui2.m

Примечание

Этот код использует запись через точку, чтобы установить свойства графического объекта. Запись через точку запускается в R2014b и позже. Если вы используете более раннюю версию, используйте вместо этого функцию set. Например, измените f.Visible = 'on' на set(f,'Visible','on').

Чтобы запустить код, перейдите к разделу Run во вкладке Editor. Затем нажмите Run .

Создание файла кода

Создайте файл функции (в противоположность script file, который содержит последовательность команд MATLAB, но не задает функции).

  1. В посдказке MATLAB введите edit.

  2. Введите следующий оператор в первой строке Редактора.

    function simple_gui2
  3. После функционального оператора введите эти комментарии, заканчивающиеся пустой строкой. (Комментарии отображаются в командной строке в ответ на команду help.)

    % SIMPLE_GUI2 Select a data set from the pop-up menu, then
    % click one of the plot-type push buttons. Clicking the button
    % plots the selected data in the axes.
    (Leave a blank line here)
  4. В конце файла, после пустой строки, добавляет оператор end. Этот оператор end требуется, потому что пример использует вложенные функции. Чтобы узнать больше, смотрите Вложенные функции.

  5. Сохраните файл в своей текущей папке или в местоположении, которое находится на вашем пути MATLAB.

Создание Окна фигуры

Чтобы создать контейнер для пользовательского интерфейса (UI) вашего приложения, добавьте следующий код перед оператором end в вашем файле:

%  Create and then hide the UI as it is being constructed.
f = figure('Visible','off','Position',[360,500,450,285]);

Вызов функции figure создает традиционную фигуру и устанавливает следующие свойства:

  • Свойство Visible собирается в 'off' сделать окно невидимым, когда компоненты добавляются или инициализируются. Окно становится видимым, когда пользовательский интерфейс имеет все свои компоненты и инициализируется.

  • Свойство Position установлено в четырехэлементный вектор, который задает местоположение пользовательского интерфейса на экране и его размере: [расстояние от левого, расстояние от нижней части, ширины, высота]. Модули по умолчанию являются пикселями.

Добавление компонентов к пользовательскому интерфейсу

Создайте кнопки, статический текст, всплывающее меню и компоненты осей к пользовательскому интерфейсу.

  1. После вызова figure добавьте эти операторы в свой файл кода, чтобы создать три компонента кнопки.

    % Construct the components.
    hsurf    = uicontrol('Style','pushbutton',...
                 'String','Surf','Position',[315,220,70,25]);
    hmesh    = uicontrol('Style','pushbutton',...
                 'String','Mesh','Position',[315,180,70,25]);
    hcontour = uicontrol('Style','pushbutton',...
                 'String','Contour','Position',[315,135,70,25]);

    Каждый оператор использует серию пар свойства/значения uicontrol, чтобы задать кнопку:

    • Свойство Style указывает, что uicontrol является кнопкой.

    • Свойство String задает метку на каждой кнопке: Surf, Mesh и Contour.

    • Свойство Position задает местоположение и размер каждой кнопки: [расстояние от левого, расстояние от нижней части, ширины, высота]. Модули по умолчанию для кнопок являются пикселями.

    Каждый вызов uicontrol возвращает указатель созданной кнопки.

  2. Добавьте всплывающее меню и текстовую метку путем добавления этих операторов в файл кода после определений кнопки. Первый оператор создает метку. Второй оператор создает всплывающее меню.

    htext  = uicontrol('Style','text','String','Select Data',...
               'Position',[325,90,60,15]);
    hpopup = uicontrol('Style','popupmenu',...
               'String',{'Peaks','Membrane','Sinc'},...
               'Position',[300,50,100,25]);
    

    Свойство String компонента всплывающего меню использует массив ячеек, чтобы задать эти три элемента во всплывающем меню: Peaks, Membrane и Sinc.

    Текстовый компонент, свойство String задает инструкции для пользователя.

    Для обоих компонентов свойство Position задает размер и местоположение каждого компонента: [расстояние от левого, расстояние от нижней части, ширины, высота]. Модули по умолчанию для этих компонентов являются пикселями.

  3. Добавьте оси путем добавления этого оператора в файл кода.

    ha = axes('Units','pixels','Position',[50,60,200,185]);

    Свойство Units задает пиксели так, чтобы оси имели те же модули как другие компоненты.

  4. После всех определений компонента добавьте эту строку в файл кода, чтобы выровнять все компоненты, кроме осей, вдоль их центров.

    align([hsurf,hmesh,hcontour,htext,hpopup],'Center','None');
  5. Добавьте эту команду после команды align.

    Примечание

    Этот код использует запись через точку, чтобы установить свойства объектов. Запись через точку запускается в R2014b и позже. Если вы используете более раннюю версию, используйте вместо этого функцию set. Например, измените f.Visible = 'on' на set(f,'Visible','on').

    f.Visible = 'on';

    Ваш файл кода должен выглядеть так:

    function simple_gui2
    % SIMPLE_GUI2 Select a data set from the pop-up menu, then
    % click one of the plot-type push buttons. Clicking the button
    % plots the selected data in the axes.
    
       %  Create and then hide the UI as it is being constructed.
       f = figure('Visible','off','Position',[360,500,450,285]);
       
       %  Construct the components.
       hsurf = uicontrol('Style','pushbutton','String','Surf',...
               'Position',[315,220,70,25]);
       hmesh = uicontrol('Style','pushbutton','String','Mesh',...
               'Position',[315,180,70,25]);
       hcontour = uicontrol('Style','pushbutton',...
               'String','Contour',...
               'Position',[315,135,70,25]); 
       htext = uicontrol('Style','text','String','Select Data',...
               'Position',[325,90,60,15]);
       hpopup = uicontrol('Style','popupmenu',...
               'String',{'Peaks','Membrane','Sinc'},...
               'Position',[300,50,100,25]);
       ha = axes('Units','Pixels','Position',[50,60,200,185]); 
       align([hsurf,hmesh,hcontour,htext,hpopup],'Center','None');
       
       % Make the UI visible.
       f.Visible = 'on';
    
    end
  6. Запустите свой код путем ввода simple_gui2 в командной строке. Можно выбрать набор данных во всплывающем меню и кликнуть по кнопкам, но ничего не происходит. Это вызвано тем, что нет никакого кода коллбэка в файле, чтобы обслужить всплывающее меню или кнопки.

Кодирование поведения приложения

Программирование всплывающего меню

Всплывающее меню позволяет пользователям выбрать данные, чтобы построить. Когда пользователь выбирает один из этих трех наборов данных во всплывающем меню, программное обеспечение MATLAB устанавливает свойство всплывающего меню Value на индекс выбранного пункта меню. Коллбэк всплывающего меню читает свойство всплывающего меню Value определить, какой элемент в настоящее время отображен и устанавливает current_data соответственно.

Добавьте следующий коллбэк в свой файл в соответствии с кодом инициализации и перед итоговым оператором end.

Примечание

Этот код использует запись через точку, чтобы получить свойства объектов. Запись через точку запускается в R2014b и позже. Если вы используете более ранний релиз, используйте функцию get вместо этого. Например, измените str = source.String на str = get(source,'String').

%  Pop-up menu callback. Read the pop-up menu Value property to
%  determine which item is currently displayed and make it the
%  current data. This callback automatically has access to 
%  current_data because this function is nested at a lower level.
   function popup_menu_Callback(source,eventdata) 
      % Determine the selected data set.
      str = source.String;
      val = source.Value;
      % Set current data to the selected data set.
      switch str{val};
      case 'Peaks' % User selects Peaks.
         current_data = peaks_data;
      case 'Membrane' % User selects Membrane.
         current_data = membrane_data;
      case 'Sinc' % User selects Sinc.
         current_data = sinc_data;
      end
   end

Программирование кнопок

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

Добавьте следующие коллбэки в свой файл после коллбэка всплывающего меню и перед итоговым оператором end.

% Push button callbacks. Each callback plots current_data in the
% specified plot type.

function surfbutton_Callback(source,eventdata) 
% Display surf plot of the currently selected data.
     surf(current_data);
end

function meshbutton_Callback(source,eventdata) 
% Display mesh plot of the currently selected data.
     mesh(current_data);
end

function contourbutton_Callback(source,eventdata) 
% Display contour plot of the currently selected data.
     contour(current_data);
end

Программирование обратных вызовов

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

  1. К оператору uicontrol, который задает кнопку Surf, добавьте пару свойства/значения

    'Callback',{@surfbutton_Callback}

    так, чтобы оператор выглядел так:

    hsurf = uicontrol('Style','pushbutton','String','Surf',...
            'Position',[315,220,70,25],...
            'Callback',{@surfbutton_Callback});

    Callback является именем свойства. surfbutton_Callback является именем коллбэка, который обслуживает кнопку Surf.

  2. К оператору uicontrol, который задает кнопку Mesh, добавьте пару свойства/значения

    'Callback',@meshbutton_Callback
  3. К оператору uicontrol, который задает кнопку Contour, добавьте пару свойства/значения

    'Callback',@contourbutton_Callback
  4. К оператору uicontrol, который задает всплывающее меню, добавьте пару свойства/значения

    'Callback',@popup_menu_Callback

Для получения дополнительной информации смотрите Запись обратных вызово для приложений, созданных программно.

Инициализация пользовательского интерфейса

Инициализируйте пользовательский интерфейс, таким образом, это готово, когда окно становится видимым. Заставьте пользовательский интерфейс вести себя правильно, когда он будет изменен путем изменения компонента и модулей фигуры к normalized. Это заставляет компоненты изменять размер, когда пользовательский интерфейс изменен. Нормированные единицы сопоставляют нижний левый угол окна рисунка к (0,0) и верхнего правого угла к (1.0, 1.0).

Примечание

Этот код использует запись через точку, чтобы установить свойства объектов. Запись через точку запускается в R2014b и позже. Если вы используете более раннюю версию, используйте вместо этого функцию set. Например, измените f.Units = 'normalized' на set(f,'Units','normalized').

Замените этот код в редакторе:

% Make the UI visible.
f.Visible = 'on';

с этим кодом:

% Initialize the UI.
% Change units to normalized so components resize automatically.
f.Units = 'normalized';
ha.Units = 'normalized';
hsurf.Units = 'normalized';
hmesh.Units = 'normalized';
hcontour.Units = 'normalized';
htext.Units = 'normalized';
hpopup.Units = 'normalized';

% Generate the data to plot.
peaks_data = peaks(35);
membrane_data = membrane;
[x,y] = meshgrid(-8:.5:8);
r = sqrt(x.^2+y.^2) + eps;
sinc_data = sin(r)./r;

% Create a plot in the axes.
current_data = peaks_data;
surf(current_data);

% Assign a name to appear in the window title.
f.Name = 'Simple GUI';

% Move the window to the center of the screen.
movegui(f,'center')

% Make the UI visible.
f.Visible = 'on';

Проверка кода и выполнение приложения

Убедитесь, что ваш код появляется, как он должен, и затем запускать его.

Примечание

Этот код использует запись через точку, чтобы получить и установить свойства объектов. Запись через точку запускается в R2014b и позже. Если вы используете более раннюю версию, используйте вместо этого функции get и set. Например, измените f.Units = 'normalized' на set(f,'Units','normalized').

  1. Проверьте, что ваш файл кода выглядит так:

    function simple_gui2
    % SIMPLE_GUI2 Select a data set from the pop-up menu, then
    % click one of the plot-type push buttons. Clicking the button
    % plots the selected data in the axes.
    
    %  Create and then hide the UI as it is being constructed.
    f = figure('Visible','off','Position',[360,500,450,285]);
    
    % Construct the components.
    hsurf    = uicontrol('Style','pushbutton',...
                 'String','Surf','Position',[315,220,70,25],...
                 'Callback',@surfbutton_Callback);
    hmesh    = uicontrol('Style','pushbutton',...
                 'String','Mesh','Position',[315,180,70,25],...
                 'Callback',@meshbutton_Callback);
    hcontour = uicontrol('Style','pushbutton',...
                 'String','Contour','Position',[315,135,70,25],...
                 'Callback',@contourbutton_Callback);
    htext  = uicontrol('Style','text','String','Select Data',...
               'Position',[325,90,60,15]);
    hpopup = uicontrol('Style','popupmenu',...
               'String',{'Peaks','Membrane','Sinc'},...
               'Position',[300,50,100,25],...
               'Callback',@popup_menu_Callback);
    ha = axes('Units','pixels','Position',[50,60,200,185]);
    align([hsurf,hmesh,hcontour,htext,hpopup],'Center','None');
    
    % Initialize the UI.
    % Change units to normalized so components resize automatically.
    f.Units = 'normalized';
    ha.Units = 'normalized';
    hsurf.Units = 'normalized';
    hmesh.Units = 'normalized';
    hcontour.Units = 'normalized';
    htext.Units = 'normalized';
    hpopup.Units = 'normalized';
    
    % Generate the data to plot.
    peaks_data = peaks(35);
    membrane_data = membrane;
    [x,y] = meshgrid(-8:.5:8);
    r = sqrt(x.^2+y.^2) + eps;
    sinc_data = sin(r)./r;
    
    % Create a plot in the axes.
    current_data = peaks_data;
    surf(current_data);
    
    % Assign the a name to appear in the window title.
    f.Name = 'Simple GUI';
    
    % Move the window to the center of the screen.
    movegui(f,'center')
    
    % Make the window visible.
    f.Visible = 'on';
    
    %  Pop-up menu callback. Read the pop-up menu Value property to
    %  determine which item is currently displayed and make it the
    %  current data. This callback automatically has access to 
    %  current_data because this function is nested at a lower level.
       function popup_menu_Callback(source,eventdata) 
          % Determine the selected data set.
          str = get(source, 'String');
          val = get(source,'Value');
          % Set current data to the selected data set.
          switch str{val};
          case 'Peaks' % User selects Peaks.
             current_data = peaks_data;
          case 'Membrane' % User selects Membrane.
             current_data = membrane_data;
          case 'Sinc' % User selects Sinc.
             current_data = sinc_data;
          end
       end
    
      % Push button callbacks. Each callback plots current_data in the
      % specified plot type.
    
      function surfbutton_Callback(source,eventdata) 
      % Display surf plot of the currently selected data.
           surf(current_data);
      end
    
      function meshbutton_Callback(source,eventdata) 
      % Display mesh plot of the currently selected data.
           mesh(current_data);
      end
    
      function contourbutton_Callback(source,eventdata) 
      % Display contour plot of the currently selected data.
           contour(current_data);
      end
    end
  2. Запустите свое приложение путем ввода simple_gui2 в командной строке. Код инициализации заставляет его отображать данные peaks по умолчанию с функцией surf, заставляя пользовательский интерфейс выглядеть так.

  3. Во всплывающем меню выберите Membrane, и затем нажмите кнопку Mesh. Пользовательский интерфейс отображает сетчатый график MathWorks® L-образный Мембранный логотип.

  4. Попробуйте другие комбинации прежде, чем закрыть пользовательский интерфейс.

  5. Введите help simple_gui2 в командной строке. Программное обеспечение MATLAB отображает текст справки.

    help simple_gui2
      SIMPLE_GUI2 Select a data set from the pop-up menu, then
      click one of the plot-type push buttons. Clicking the button
      plots the selected data in the axes.

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте