Você está na página 1de 9

Aula 2

O Matlab possui uma ferramenta para simplificar a criação de GUIs, o GUIDE. Neste curso, vamos criar uma interface simples, com dois
eixos de plot, um campo de entrada de dados, dois botões de radio e um botão de apertar. No primeiro eixo vamos plotar um seno, e no
segundo vamos plotar um cosseno ou uma tangente, dependendo do botão de radio marcado. A frequência da senoide será inicialmente 0,
mas poderá ser alterada através do campo de dado.

Criação da interface

Para iniciar a criação da interface, escolha a pasta que você quer que os arquivos estejam salvos e digite na janela de comandos:

>> guide

Na janela quick start que apareceu, escolha Blank GUI e pressione OK.

A janela que se abre é o editor de interfaces. É aí que os botões são dispostos na janela. Para adicionar uma componente, basta clicar no
botão na parte esquerda e arrastá-lo para a parte central, na posição desejada. Cada componente adicionada possui atributos, que podem
ser visualizados através de um duplo clique:

Inicie com a criação de 3 painéis, como dispostos na figura:


Inclua 2 axes nos painéis superior esquerdo e direito:

Por fim, inclua um campo edit text no painel inferior esquerdo dois radiobuttons na parte inferior do painel direito:

É possível alterar as informações escritas na interface, clicando duas vezes na componente e alterando o campo Title, no caso dos painéis,
ou String para os demais. A interface concluída pode ser vista abaixo:

Salve o arquivo com o nome interface, uma janela com vários códigos irá aparecer. Ao digitar na janela de comando o comando interface, a
janela da interface se abrirá.

Repare que nenhuma ação é executada ao clicar nos botões ou alterar o campo de texto. Isso acontece porque apenas a interface está
criada, falta atribuir ações à cada uma das componentes. É isso que faremos na próxima etapa.
Atribuir uma ação às componentes

Ao salvar a interface criada, dois arquivos são gerados pela ferramenta, um interface.fig, que é a interface em si, e interface.m que é o
código que indica a ação que cada componente gera. Este arquivo é organizado como funções, das quais as mais importantes são:

• interface: Abre a interface criada.


• interface_OpeningFcn: Última função executada antes que a interface seja efetivamente criada. É usada para inicialização de
variáveis, etc.
• <componente>_Callback: Ação executada pelo componente ao ser pressionado.

Assim, para atribuir ações aos componentes, basta indicá-las no espaço correspondente à componente. Após escrever o código, não
esqueça de salvar o arquivo. A seguir, vamos atribuir algumas ações às componentes:

Ação do botão

Inclua na função pushbutton1_Callback o código:

display('Botão pressionado')

salve, e execute a função. Repare que toda vez que o botão é pressionado, uma mensagem Botão pressionado é impressa na janela de
comandos.

Plotando ao pressionar o botão

Para plotar um gráfico ao pressionar o botão, inclua na função pushbutton1_Callback o código:

plot(randn(1,10))

Referenciando uma componente específica

Repare que o eixo em que o gráfico foi plotado não foi escolhido. Para escolher o eixo, é preciso passar para a função plot um indicador da
componente a ser utilizada. Todas as componentes estão dispostas na variável handles, struct criada automaticamente pela ferramenta
GUIDE. Para esta interface, a variável handles possui os seguintes campos:

handles =
figure1: 191.0381
uipanel3: 27.0389
uipanel2: 25.0389
uipanel1: 19.0397
pushbutton1: 192.0381
radiobutton1: 34.0389
radiobutton2: 33.0389
axes2: 28.0389
edit1: 26.0389
axes1: 20.0389
output: 191.0381

Os valores atribuídos à cada campo não são muito importante, são as referências que o Matlab criou ao gerar a interface. Assim, para
escolher o eixo em que o plot será feito, basta passar o valor handles.axes1 ou handles.axes2.
Guardando valores entre componentes

A ação de cada componente é atribuída por uma função dentro do arquivo interface.m. Sendo funções, todas as variáveis criadas são
apagadas após sua execução. Caso seja necessário guardar valores entre as ações das componentes, pode-se atribuir à variável handles
outros campos, que guardarão os valores desejados.

Por exemplo, para criar um contador de apertos no botão, precisamos de uma variável que guarde o número de vezes que o botão foi
pressionado. Criamos um campo chamado contador na variável handles, inicializado com 0, e atribuímos a ação de somar 1 sempre que o
botão for pressionado.

Para criar o campo e inicializá-lo com zero, inserimos um código à função interface_OpeningFcn, que ficará assim:

% --- Executes just before interface is made visible.


function interface_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to interface (see VARARGIN)

handles.contador = 0; %------------------------- Criando o contador

% Choose default command line output for interface


handles.output = hObject;

% Update handles structure


guidata(hObject, handles);

O incremento do contador, e a impressão da mensagem com o número de vezes que o botão foi pressionado são incluídos na função
pushbutton1_Callback:

handles.contador = handles.contador + 1;
display(['O botão foi pressionado ' num2str(handles.contador) ' vezes'])

Porém, ao executar a interface e pressionar o botão, observamos que aparece sempre a mesma mensagem:

>> interface
O botão foi pressionado 1 vezes
O botão foi pressionado 1 vezes
O botão foi pressionado 1 vezes

Isso acontece porque as funções de ação não retornam nenhum valor, ou seja, a alteração realizada na variável handle.contador se perde
após a execução da função. Para salvar as variáveis, é necessário usar a função guidata(hObject, handles);. Assim, a função
pushbutton1_Callback ficará:

function pushbutton1_Callback(hObject, eventdata, handles)


% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)

handles.contador = handles.contador + 1;
display(['O botão foi pressionado ' num2str(handles.contador) ' vezes']) guidata(hObject, handles);

Com isso, o problema está resolvido:

>> interface
O botão foi pressionado 1 vezes
O botão foi pressionado 2 vezes
O botão foi pressionado 3 vezes
Capturando o valor do campo de texto

O valor do campo de texto está armazenado na variável hObject, que como o próprio nome já diz, é um objeto. Para atribuir ou receber
valores da variável hObject, usamos respectivamente as funções set(hObject,'<atributo>',<valor>) e get(hObject,'<atributo>'). Vimos
anteriormente que a variável handles traz a referência para todos os componentes da interface. Em contrapartida, a variável hObject traz os
atributos apenas da componente atual, que estamos atribuindo a ação. Cada componente tem seu conjunto de atributos.

Para ver os atributos disponíveis no campo de texto, incluímos na sua função de ação (edit1_Callback) o código get(hObject). Ao alterar o
valor do campo, a seguinte mensagem é impressa na janela de comandos:

BackgroundColor = [1 1 1]
Callback = [ (1 by 1) function_handle array]
CData = []
Enable = on
Extent = [0 0 24.8 1.38462]
FontAngle = normal
FontName = MS Sans Serif
FontSize = [8] FontUnits = points
FontWeight = normal
ForegroundColor = [0 0 0]
HorizontalAlignment = center
KeyPressFcn = ListboxTop = [1]
Max = [1]
Min = [0]
Position = [3.6 1.76923 32.2 2.30769]
String = Valor alterado-------------
Style = edit
SliderStep = [0.01 0.1]
TooltipString =
Units = characters
Value = [0]
BeingDeleted = off
ButtonDownFcn =
Children = []
Clipping = on
CreateFcn = [ (1 by 1)
function_handle array]
DeleteFcn =
BusyAction = queue
HandleVisibility = on
HitTest = on
Interruptible = on
Parent = [25.0402]
Selected = off
SelectionHighlight = on
Tag = edit1
Type = uicontrol
UIContextMenu = []
UserData = []
Visible = on

Repare que o atributo String recebeu o valor digitado no campo de texto. Assim, é esse o campo que precisamos ler se quisermos receber
o valor da frequência digitado pelo usuário. Para guardar o valor digitado, criamos um campo na variável handles.

Criamos o campo f na variável handles e inicializamos com zero, na função interface_OpeningFcn:

function interface_OpeningFcn(hObject, eventdata, handles, varargin)


% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to interface (see VARARGIN)
handles.f = 0;

% Choose default command line output for interface


handles.output = hObject;

% Update handles structure


guidata(hObject, handles);

Adicionamos a ação de guardar o valor digitado no campo de texto, na função edit1_Callback. Não esquecer de salvar a alteração na
variável com a função guidata(hObject, handles);:

function edit1_Callback(hObject, eventdata, handles)


% hObject handle to edit1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)

handles.f = get(hObject,'String');
guidata(hObject, handles);

Por fim, configuramos no botão a ação de mostrar na janela de comandos o valor da variável handles.f:

function pushbutton1_Callback(hObject, eventdata, handles)


% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)

display(['Valor da variável f: ' handles.f])

Veja as mensagens exibidas, sempre que o botão é pressionado

>> interface
Valor da variável f: 4
Valor da variável f: 5
Valor da variável f: ola amiguinhos

Utilizando os radiobuttons

Cada radiobutton tem uma função de ação. O estado de um botão de ação é acessado pelo atributo Value, que se for igual a 1 indica que o
botão está marcado e se for igual a 0 indica que o botão não está marcado. Dependendo de vários fatores, ao marcar um botão, é possível
que um botão previamente marcado seja desmarcado ou não. Assim, uma ação interessante de ser executada quando um radiobutton for
marcado é a desmarcação dos outros radiobuttons. Ou seja, na função de ação do radiobutton1, radiobutton1_Callback, escrevemos:

set(handles.radiobutton1,'Value',1)
set(handles.radiobutton2,'Value',0)

E na função de ação do radiobutton2, radiobutton2_Callback, escrevemos:

set(handles.radiobutton1,'Value',0)
set(handles.radiobutton2,'Value',1)

Repare que os atributos dos componentes também podem ser acessados a partir da referência disponível na variável handles.
É interessante também guardar o radiobutton escolhido. Para isso, criamos uma variável chamada estado, como um campo da variável
handles. Esta variável terá os valores 1 ou 2, dependendo do radiobutton escolhido. Além disso, pode ser necessário inserir um estado
inicial dos radiobuttons, evitando que todos fiquem desmarcados. Assim, para trabalhar com os radiobuttons fazemos:

- Adicionamos na função interface_OpeningFcn a criação da variável estado e a rotina de inserção do seu estado inicial:

function interface_OpeningFcn(hObject, eventdata, handles, varargin)


% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to interface (see VARARGIN)

% Diz que o botão selecionado é o 1


handles.estado = 1;

% Inicializa o estado dos botões


set(handles.radiobutton1,'Value',1)
set(handles.radiobutton2,'Value',0)

% Choose default command line output for interface


handles.output = hObject;

% Update handles structure


guidata(hObject, handles);

- Dizemos que, ao selecionar um radiobutton o outro deve ser desmarcado, e guardamos o estado dos botões:

function radiobutton1_Callback(hObject, eventdata, handles)


% hObject handle to radiobutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)

% Diz que o botão selecionado é o 1


handles.estado = 1;
set(handles.radiobutton1,'Value',1)
set(handles.radiobutton2,'Value',0)

% Update handles structure


guidata(hObject, handles);

function radiobutton2_Callback(hObject, eventdata, handles)


% hObject handle to radiobutton2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)

% Diz que o botão selecionado é o 2


handles.estado = 2;
set(handles.radiobutton1,'Value',0)
set(handles.radiobutton2,'Value',1)

% Update handles structure


guidata(hObject, handles);

- Inserimos uma função de display como ação do botão:

function pushbutton1_Callback(hObject, eventdata, handles)


% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)

display(['Radiobutton selecionado: ' num2str(handles.estado)])

Repare que foi necessário converter o número para string. Ao executar a interface, observamos o resultado esperado:

>> interface
Radiobutton selecionado: 1
Radiobutton selecionado: 2
Radiobutton selecionado: 2

Completando a interface

Para completar a interface, seguimos os passos:


- Na função interface_OpeningFcn, inserimos um estado inicial para os botões, geramos um estado inicial para a frequência dos sinais,
geramos o eixo do tempo no qual os sinais estarão definidos e fazemos os plots com os valores padrão:

function interface_OpeningFcn(hObject, eventdata, handles, varargin)


% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to interface (see VARARGIN)

% ------------------------------------------------------
% Diz que o botão selecionado é o 1
handles.estado = 1;

% Inicializa o estado dos botões


set(handles.radiobutton1,'Value',1)
set(handles.radiobutton2,'Value',0)

% Inicializa os valores dos sinais


handles.f = 0;
handles.t = 0:0.001:1;

% Faz os plots com os valores padrão plot(handles.axes1,sin(2*pi*handles.f*handles.t)) plot(handles.axes2,cos(2*pi*handles.f*handles.t))

% ------------------------------------------------------

% Choose default command line output for interface


handles.output = hObject;

% Update handles structure


guidata(hObject, handles);

- Na função radiobutton1_Callback, incluímos os códigos para o comportamento adequado:

function radiobutton1_Callback(hObject, eventdata, handles)


% hObject handle to radiobutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)

% Diz que o botão selecionado é o 1


handles.estado = 1;
set(handles.radiobutton1,'Value',1)
set(handles.radiobutton2,'Value',0)
% Update handles structure
guidata(hObject, handles);

- O mesmo para a função radiobutton2_Callback

function radiobutton2_Callback(hObject, eventdata, handles)


% hObject handle to radiobutton2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)

% Diz que o botão selecionado é o 1


handles.estado = 2;
set(handles.radiobutton1,'Value',0)
set(handles.radiobutton2,'Value',1)

% Update handles structure


guidata(hObject, handles);

- Na função edit1_Callback, armazenamos o valor digitado no campo de texto na variável f

function edit1_Callback(hObject, eventdata, handles)


% hObject handle to edit1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)

% Pega o valor digitado


handles.f = str2double(get(hObject,'String'));

% Update handles structure


guidata(hObject, handles);

- Por fim, na função pushbutton1_Callback, plotamos o seno com o valor atual de frequência e selecionamos o segundo plot baseados no
radiobutton escolhido:

function pushbutton1_Callback(hObject, eventdata, handles)


% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)

% Faz os plots com os valores padrão plot(handles.axes1,sin(2*pi*handles.f*handles.t))

if handles.estado == 1
plot(handles.axes2,cos(2*pi*handles.f*handles.t))
elseif handles.estado == 2
plot(handles.axes2,tan(2*pi*handles.f*handles.t))
end

Referencia bibliográfica

Elaborado pelo professor Diego da Silva de Medeiros dentro do projeto intitulado MATLAB - Software de estudos matemáticos.

Você também pode gostar