Share information between two (app disigner) apps - matlab

Can anyone please tell me how can i make my main app open a secondary app which will capture some values and then send them back to my main app?
I'm aware that this issue is tackled in app designer documentation, but I have been unable to implement those steps successfully. Also, I tried to run the example but Matlab says the file doesn't exists. If anyone could please share that example it would be also very helpful.

I have never tried to implement this on my own, but I often wandered myself how I could accomplish this if facing a complex apps architecture.
Actually, if you instantiate two GUIs in the same script/function, or if you have one GUI creating another GUI inside one of its functions, the simplest way would be to play with function handles. For example, the first GUI can pass a function handle defined among its functions to the target GUI's constructor and, this way, the target GUI can invoke it in order to modify the first GUI's data and/or properties when necessary.
The standard approach, anyway, which is considered as a best practice, works as follows. Let's assume that you have two GUIs named G1 and G2 and that they are distinct (you are not running two instances of the same GUI). If they are both visible (HandleVisibility set to on) and they both have a Tag identifier defined (G1 and G2 in our example), you can search for them within the Matlab "workspace". Hence:
% This is a G2 event handler
function pushbutton1_Callback(hObject, eventdata, handles)
g1_h = findobj('Tag','G1');
if (~isempty(g1_h))
% get all data associated to G1
g1_data = guidata(g1_h);
% modify a G2 object based on a G1 object
set(handles.MyTextBox,'String',get(g1_data.MyEditBox,'String'));
end
end

MATLAB's App Designer generates class-based GUI's rather than GUIDE's function-based GUIs. The advantage of this approach is that we can pass the GUIs around as objects rather than having to get creative with things like function returns or searching for objects by tag.
Here's a simple programmatic example that illustrates one approach to this concept. The main figure window opens a secondary prompt window, which provides two inputs. When the prompt window is closed, the primary GUI prints the input values to the command window and exits.
The main window:
classdef mainwindow < handle
properties
mainfig
butt
end
methods
function [self] = mainwindow()
% Build a GUI
self.mainfig = figure('Name', 'MainWindow', 'Numbertitle', 'off', ...
'MenuBar', 'none', 'ToolBar', 'none');
self.butt = uicontrol('Parent', self.mainfig, 'Style', 'Pushbutton', ...
'Units', 'Normalized', 'Position', [0.1 0.1 0.8 0.8], ...
'String', 'Push Me', 'Callback', #(h,e) self.buttoncallback);
end
function buttoncallback(self)
tmpwindow = subwindow(); % Open popupwindow
uiwait(tmpwindow.mainfig); % Wait for popup window to be closed
fprintf('Parameter 1: %u\nParameter 2: %u\n', tmpwindow.parameter1, tmpwindow.parameter2);
close(self.mainfig);
end
end
end
The sub window:
classdef subwindow < handle
properties
mainfig
label1
box1
label2
box2
closebutton
parameter1
parameter2
end
methods
function [self] = subwindow()
% Build a GUI
self.mainfig = figure('Name', 'SubWindow', 'Numbertitle', 'off', ...
'MenuBar', 'none', 'ToolBar', 'none');
self.label1 = uicontrol('Parent', self.mainfig, 'Style', 'text', ...
'Units', 'Normalized', 'Position', [0.4 0.7 0.2 0.05], ...
'String', 'Parameter 1');
self.box1 = uicontrol('Parent', self.mainfig, 'Style', 'edit', ...
'Units', 'Normalized', 'Position', [0.4 0.6 0.2 0.1], ...
'String', '10');
self.label2 = uicontrol('Parent', self.mainfig, 'Style', 'text', ...
'Units', 'Normalized', 'Position', [0.4 0.4 0.2 0.05], ...
'String', 'Parameter 2');
self.box2 = uicontrol('Parent', self.mainfig, 'Style', 'edit', ...
'Units', 'Normalized', 'Position', [0.4 0.3 0.2 0.1], ...
'String', '10');
self.closebutton = uicontrol('Parent', self.mainfig, 'Style', 'Pushbutton', ...
'Units', 'Normalized', 'Position', [0.4 0.1 0.2 0.1], ...
'String', 'Close Window', 'Callback', #(h,e) self.closewindow);
end
function closewindow(self)
% Drop our input parameters into this window's properties
self.parameter1 = str2double(self.box1.String);
self.parameter2 = str2double(self.box2.String);
% Close the window
close(self.mainfig);
end
end
end

Related

MATLAB GUI: how to update handles when new objects are created in a subfunction?

I have a problem with my MATLAB GUI.
I am not using GUIDE so I am self coding everything for my GUI. I have a Main which generates the a first panel of the GUIDE. This panel contains a button which can create other 2 panels through its related callback function. In the other 2 panels it is possible to do other operations calling other callback functions. One of these operations is to create 2 new static texts and 2 new editable texts. I have problems in updating the handles related to those editable texts. More precisely I am not able to retrieve the value of their string once the text is edited and the callback functions of the last 2 panels are called again.
Attached is the code where all the callback functions of the GUI are:
%% server_selected callback function
function server_selected(hObject, eventdata, handles)
%UNTITLED8 Summary of this function goes here
% Detailed explanation goes here
% Get server version and run LaunchCDbQuery
servers = get(handles.server_popup, 'String');
serverVersion = servers{get(handles.server_popup, 'Value')};
[Day] = LaunchCDbQuery(serverVersion);
assignin('base', 'Day', Day)
% Update current outing on GUI
set(handles.outing_text, 'String', strcat(Day.date, Day.DocumentKey))
% Tool description
% Create panel for the tool description
handles.description_panel = uipanel('Title', 'Tool description',...
'units', 'normalized',...
'position', [0.675, 0.025, 0.3, 0.9]);
% Create items inside the panel for the tool description
% Function heading
handles.funheading_text = uicontrol('Parent', handles.description_panel,...
'Style', 'text',...
'units', 'normalized',...
'position', [0, 0.7, 1, 0.2],...
'String', 'Please choose a tool and click description to obtain the tool''s heading and description.',...
'HorizontalAlignment', 'left');
% Function description
handles.description_text = uicontrol('Parent', handles.description_panel,...
'Style', 'text',...
'units', 'normalized',...
'position', [0, 0.05, 1, 0.6],...
'HorizontalAlignment', 'left');
% Tool selection
% Create panel for the tool selection
handles.tool_panel = uipanel('Title', 'Tool selection',...
'units', 'normalized',...
'position', [0.35 0.025 0.3 0.9]);
% Create items inside the panel for the tool selection
% Text
handles.tool_text = uicontrol('Parent', handles.tool_panel,...
'Style', 'text',...
'units', 'normalized',...
'position', [0 0.7 1 0.2],...
'String', 'Please choose a tool to perform a piece of analysis.',...
'HorizontalAlignment', 'left');
% Popup
handles.tool_popup = uicontrol('Parent', handles.tool_panel,...
'Style', 'popup',...
'units', 'normalized',...
'position', [0.2 0.25 0.6 0.4],...
'String', {'plotmaptg'; 'TestReview'});
% Input variables panel
handles.varin_panel = uipanel('Parent', handles.tool_panel,...
'Title', 'Type input variables',...
'units', 'normalized',...
'position', [0, 0, 1, 0.3]);
% Description push
handles.tool_push_description = uicontrol('Parent', handles.tool_panel,...
'Style', 'pushbutton',...
'units', 'normalized',...
'position', [0.05 0.4 0.4 0.1],...
'String', 'Description',...
'callback', {#tool_description, handles});
% Ok push
handles.tool_push_ok = uicontrol('Parent', handles.tool_panel,...
'Style', 'pushbutton',...
'units', 'normalized',...
'position', [0.51 0.4 0.4 0.1],...
'String', 'Ok',...
'callback', {#tool_selected, handles, Day});
% Update guidata
guidata(hObject, handles)
end
%% tool_description callback function
function tool_description(hObject, eventdata, handles)
%UNTITLED2 Summary of this function goes here
% Detailed explanation goes here
% Call handles function
handles = tool_description_handles(handles);
% Update guidata
guidata(hObject, handles)
end
function newHandles = tool_description_handles(handles)
%UNTITLED Summary of this function goes here
% Detailed explanation goes here
% Get tool name
tools = get(handles.tool_popup, 'String');
tool_selected = tools{get(handles.tool_popup, 'Value')};
% Open tool .m file
fid = fopen(strcat(tool_selected, '.m'), 'r');
% Read .m file to find function description and save it
line = fgets(fid);
heading = line;
while isempty(regexp(line, '%', 'ONCE'))
line = fgets(fid);
end
description = [];
while ~isempty(regexp(line, '%', 'ONCE'))
description = strcat(description, line(regexp(line, '%', 'ONCE'):end));
line = fgets(fid);
end
description(regexp(description, '%')) = [];
fclose(fid);
% Set descritption found to the description handle
set(handles.funheading_text, 'String', heading);
set(handles.description_text, 'String', description);
% Find the input variables needed to run the tool
global inputs varout
[varin, varout] = get_arg_names(strcat(pwd, '\Tools\', tool_selected, '.m'));
inputs = cell(1, length(varin{1,1}));
for i = 1:length(varin{1,1})
% Input variable text
handles.varin_text(i) = uicontrol('Parent', handles.varin_panel,...
'Style', 'text',...
'units', 'normalized',...
'position', [0, 1-i*(1/length(varin{1,1})), 0.45, 1/length(varin{1,1})],...
'String', varin{1,1}{i,1},...
'HorizontalAlignment', 'left');
% Input variables editable text
handles.varin_edit(i) = uicontrol('Parent', handles.varin_panel,...
'Style', 'edit',...
'units', 'normalized',...
'position', [0.55, 1-i*(1/length(varin{1,1})), 1, 1/length(varin{1,1})],...
'HorizontalAlignment', 'left',...
'callback', {#varin_callback, handles});
end
% Save handles
newHandles = handles;
end
function varin_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)
% Save in the main workspace the input variables
global inputs
for i = 1:length(inputs)
if isempty(inputs{1,i})
inputs{1,i} = get(hObject,'String');
break
end
end
end
%% tool_selected callback function
function tool_selected(hObject, eventdata, handles, Day)
%UNTITLED Summary of this function goes here
% Detailed explanation goes here
% Get tool name
tools = get(handles.tool_popup, 'String');
tool = tools{get(handles.tool_popup, 'Value')};
% fh = str2func(tool);
% Get tool inputs and outputs
global inputs varout
% Run the tool
if ~isempty(varout)
expression = strcat('out = ', tool, '(');
else
expression = strcat(tool, '(');
end
for i = 1:length(inputs)
if ~isempty(inputs{1,i})
expression = strcat(expression, inputs{1,i}, ',');
else
break
end
end
expression(end) = ')';
eval(expression)
% Update guidata
guidata(hObject, handles)
end
I have tried using guidata(hObject, handles) at the end of each function but it did not work out. As now I am using global variables to avoid the problem but I would really like to just update the handles as they are modified.
When providing an input variable to a callback function, the variable that is passed when you invoke the callback is that variable as it exists when the callback is defined. MATLAB does not know to update these inputs as you modify guidata.
You can see this with the following example:
function testcode
h.mf = figure('Menubar', 'none', 'NumberTitle', 'off', 'ToolBar', 'none');
h.lb = uicontrol('Parent', h.mf, 'Style', 'Listbox', ...
'Units', 'Normalized', 'Position', [0.1 0.5 0.4 0.4] ...
);
h.b1 = uicontrol('Parent', h.mf, 'Style', 'pushbutton', ...
'Units', 'Normalized', 'Position', [0.1 0.1 0.4 0.3], ...
'String', 'Pass handles','Callback', {#button1push, h});
h.b2 = uicontrol('Parent', h.mf, 'Style', 'pushbutton', ...
'Units', 'Normalized', 'Position', [0.5 0.1 0.4 0.3], ...
'String', 'Use GUIdata', 'Callback', #button2push);
guidata(h.mf, h);
makepanel(h.mf);
end
function makepanel(mf)
h = guidata(mf);
h.panel = uipanel('Parent', h.mf, 'Title', 'A Panel', ...
'Units', 'Normalized', 'Position', [0.5 0.5 0.4 0.4] ...
);
guidata(h.mf, h);
end
function button1push(~, ~, h)
h.lb.String = fieldnames(h);
end
function button2push(hObj, ~)
h = guidata(hObj);
h.lb.String = fieldnames(h);
end
Push each button and look at the output in the listbox. You can see that the change to h made in makepanel is not shown when you hit Button 1.
Rather than passing handles as a callback input (like Button 1 above), call guidata with an output at the beginning of your function to obtain the most current version of handles. If your callback makes changes to the handles structure, call guidata again to store these changes for other callbacks.

MATLAB: How to pass data between 2 GUIs using the findobj-Function?

i am new to creating GUIs with Matlab. I have one MainGui from which i open a Subgui so that the user can click checkboxes. After clicking the okay-Button my Subgui closes and one sees the MainGui-surface again.
How can i access the clickbutton value without using getappdata and setappdata and instead doing it with findobj-function which when it works is far easier for me.
So i am in the MainGui code and i look for the Subgui with
hGui = findobj('Tag','Subgui');
where 'Subgui' is the value of the Tag property of the SubGUI. Handles visibility is on for both!!
% get control handles for this GUI
handlesSubgui = guidata(hGui);
% now read the data from the checkbox
checkValue = get(handlesSubgui.checkbox1,'Value');
Why doesnt it work? i set the correct Tags and handle visilility is on but i get
hGui =
Empty matrix: 0-by-1
!?
Has anyone an idea? i would be glad to get help!
Best regards, John
One option to consider for a case like this is to initialize a small GUI inside your button callback. To illustrate, I'll set up a little programmatic GUI:
function testcode
res = get(0,'ScreenSize');
figdim = [300 300]; % Figure size, pixels
h.mainfig = figure( ...
'Units', 'Pixels', ...
'Position', [(res(3) - figdim(1))/2 (res(4) - figdim(2))/2 figdim(1) figdim(2)], ...
'Name', 'This is the Main GUI', ...
'Resize', 'off', ...
'DockControls', 'off', ...
'NumberTitle', 'off', ...
'MenuBar', 'none', ...
'Toolbar', 'none' ...
);
h.subGUIbutton = uicontrol( ...
'Parent', h.mainfig, ...
'Units', 'Normalized', ...
'Position', [0.25 0.6 0.5 0.3], ...
'String', 'Open Checkbox GUI' ...
);
h.displaydatabutton = uicontrol( ...
'Parent', h.mainfig, ...
'Units', 'Normalized', ...
'Position', [0.25 0.1 0.5 0.3], ...
'String', 'Display Checkbox Selections' ...
);
% Requires R2014b or newer, otherwise we'll have to use set
try
h.subGUIbutton.Callback = {#checkboxGUI, h};
h.displaydatabutton.Callback = {#displaydata, h};
catch
set(h.subGUIbutton, 'Callback', {#checkboxGUI, h});
set(h.displaydatabutton, 'Callback', {#displaydata, h});
end
And our callbacks will be structured like this:
function checkboxGUI(~, ~, handles)
res = get(0,'ScreenSize');
figdim = [200 200]; % Figure size, pixels
h2.mainfig = figure( ...
'Units', 'Pixels', ...
'Position', [(res(3) - figdim(1))/2 (res(4) - figdim(2))/2 figdim(1) figdim(2)], ...
'Name', 'This is the Sub GUI', ...
'Resize', 'off', ...
'DockControls', 'off', ...
'NumberTitle', 'off', ...
'MenuBar', 'none', ...
'Toolbar', 'none' ...
);
% Build some checkboxes
for ii = 1:4
h2.checkbox(ii) = uicontrol( ...
'Parent', h2.mainfig, ...
'Style', 'checkbox', ...
'Units', 'Normalized', ...
'Position', [0.25 (1 - ii*0.15) 0.5 0.1], ...
'String', sprintf('Checkbox #%u', ii) ...
);
end
h2.closebutton = uicontrol( ...
'Parent', h2.mainfig, ...
'Style', 'pushbutton', ...
'Units', 'Normalized', ...
'Position', [0.25 0.15 0.5 0.1], ...
'String', 'Accept Changes', ...
'Callback', {#closecheckbox} ...
);
function closecheckbox(~, ~)
% requires R2014b or newer for dot notation
try
test = find([h2.checkbox(:).Value]); % Returns ID of checked boxes
catch
test = find(cell2mat(get(h2.checkbox(:), 'Value'))'); % Returns ID of checked boxes
setappdata(handles.mainfig, 'BoxesChecked', test);
close(h2.mainfig);
end
waitfor(h2.mainfig); % Wait for user to close the checkbox GUI
end
function displaydata(~, ~, handles)
BoxesChecked = getappdata(handles.mainfig, 'BoxesChecked');
if isempty(BoxesChecked)
fprintf('No boxes celected\n');
else
fprintf('User selected box: %d\n', BoxesChecked);
end
end
Note that I've used a nested function for readability. In this simple example we have two buttons in our main GUI, a button to open the user prompt and then a display button. When the user opens the checkbox prompt, execution of all GUI commands pauses until the prompt is closed. When the display button is clicked, we get the checked values from the app data and print them to the command window.

One function for multiple pushbuttons in matlab

I was thinking of setting one function for multiple pushbuttons, They all do the same thing, but it has a different defining value. This is so that when one pushbutton is activated it does not get mixed up with the other pushbutton of the same function
See the documentation for callbacks. Callbacks accept two input arguments by default: the handle of the object that invoked the function and a structure of event data from the object, which may or may not be empty. You can use the String or Tag properties of your pushbutton to control behavior of your GUI based on what button is pressed using a single callback function. Consider the following example:
function testGUI
handles.mainwindow = figure();
handles.mytextbox = uicontrol( ...
'Style', 'edit', ...
'Units', 'normalized', ...
'Position', [0.15 0.80 .70 .10], ...
'String', 'No Button Has Been Pressed' ...
);
handles.button(1) = uicontrol( ...
'Style', 'pushbutton', ...
'Units', 'normalized', ...
'Position', [0.05 0.05 .30 .70], ...
'String', 'Button1', ...
'Callback', {#mybuttonpress,handles} ...
);
handles.button(2) = uicontrol( ...
'Style', 'pushbutton', ...
'Units', 'normalized', ...
'Position', [0.35 0.05 .30 .70], ...
'String', 'Button2', ...
'Callback', {#mybuttonpress,handles} ...
);
handles.button(3) = uicontrol( ...
'Style', 'pushbutton', ...
'Units', 'normalized', ...
'Position', [0.65 0.05 .30 .70], ...
'String', 'Button3', ...
'Callback', {#mybuttonpress,handles} ...
);
end
function mybuttonpress(src, ~, handles)
switch src.String
case 'Button1'
handles.mytextbox.String = 'Button 1 Has Been Pressed';
case 'Button2'
handles.mytextbox.String = 'Button 2 Has Been Pressed';
case 'Button3'
handles.mytextbox.String = 'Button 3 Has Been Pressed';
otherwise
% Something strange happened
end
end
Note that this requires MATLAB R2014b or newer in order to use the dot notation for accessing object properties. See this blog post for more information.
You can just define a generic function and call it from all of your push button callbacks

Modifying uitable column header alignment?

I'm updating my generic data manipulation GUI and I thought I would make use of a uitable instead of a uicontrol listbox to display the path(s) and filename(s) of the loaded files. I noticed the column headers are centered by default, and I can't seem to figure out how to left align them if the filename is longer than the width of the table. I checked the properties returned by get and poked around with findjobj but didn't find anything obvious. My attempt to use an html string was also unsuccessful.
Am I missing something obvious?
Sample code:
function testcode
res = get(0,'ScreenSize');
figdim = [1280 720]; % Main figure size, pixels
handles.mainfig = figure( ...
'Units', 'Pixels', ...
'Position', [(res(3) - figdim(1))/2 (res(4) - figdim(2))/2 figdim(1) figdim(2)], ...
'Name', 'Meep', ...
'Resize', 'off', ...
'DockControls', 'off', ...
'NumberTitle', 'off', ...
'Toolbar', 'figure' ...
);
handles.filetable = uitable( ...
'Parent', handles.mainfig, ...
'Units', 'normalized', ...
'Position', [0.038 0.71 0.235 0.1], ...
'ColumnName', 'File Loaded', ...
'Data', {'None'} ...
);
handles.loadfilebtn = uicontrol( ...
'Parent', handles.mainfig, ...
'Style', 'pushbutton', ...
'Units', 'normalized', ...
'Position', [0.075 0.85 0.16 0.07], ...
'String', 'This is a Button, Click', ...
'Callback', {#abutton} ...
);
guidata(handles.mainfig, handles);
end
function abutton(hObject,~)
handles = guidata(hObject);
filepath = 'C:\folder\folder\folder\folder\folder\folder\folder\folder\folder\superduperreallylongfilename.fileextension';
set(handles.filetable,'Data',{filepath});
set(handles.filetable,'ColumnWidth',{length(filepath)*5});
test = '<html><left />File Loaded</html>';
set(handles.filetable,'ColumnName',test); % Attempt #1, doesn't work
end
The easiest workaround I could think of, is to split table and table-header in two separate uitables. It's a little fiddly to set the position vectors properly, but generally it works like a charm. Important: place the "header-uitable" below (in code first) the "data-table". You save some trouble this way.
function testcode
close all
res = get(0,'ScreenSize');
figdim = [1280 720]; % Main figure size, pixels
handles.mainfig = figure( ...
'Units', 'Pixels', ...
'Position', [(res(3) - figdim(1))/2 (res(4) - figdim(2))/2 figdim(1) figdim(2)], ...
'Name', 'Meep', ...
'Resize', 'off', ...
'DockControls', 'off', ...
'NumberTitle', 'off', ...
'Toolbar', 'figure' ...
);
handles.tableheader = uitable( ...
'Parent', handles.mainfig, ...
'Units', 'normalized', ...
'Position', [0.038 0.71 0.235 0.1], ...
'ColumnName', 'File Loaded', ...
'ColumnWidth', {271} ...
);
handles.filetable = uitable( ...
'Parent', handles.mainfig, ...
'Units', 'normalized', ...
'Position', [0.038 0.682 0.235 0.1], ...
'ColumnName', {}, ...
'Data', {'None'} ...
);
handles.loadfilebtn = uicontrol( ...
'Parent', handles.mainfig, ...
'Style', 'pushbutton', ...
'Units', 'normalized', ...
'Position', [0.075 0.85 0.16 0.07], ...
'String', 'This is a Button, Click', ...
'Callback', {#abutton} ...
);
guidata(handles.mainfig, handles);
end
function abutton(hObject,~)
handles = guidata(hObject);
filepath = 'C:\folder\folder\folder\folder\folder\folder\folder\folder\folder\superduperreallylongfilename.fileextension';
set(handles.filetable,'Data',{filepath});
set(handles.filetable,'ColumnWidth',{length(filepath)*5});
end
You've mentioned findjobj, which allows you to get the JTable object behind your table. What you're actually trying to do is change some properties of the header, or JTableHeader object. Once you know what you're looking for the solution is easy to find (e.g. this previous thread).
In summary, put this code at the end of the button callback:
function abutton(hObject,~)
%// ....
hTable = handles.filetable;
jScrollpane = findjobj(hTable);
jTable = jScrollpane.getComponent(0).getComponent(0);
%// You can see the list of components using findjobj(hTable).list
%// Part1:
dtcr = javaObject('javax.swing.table.DefaultTableCellRenderer');
dtcr.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
jTable.getColumn(jTable.getColumnName(0)).setHeaderRenderer(dtcr);
%// Part2:
jRenderer = jTable.getTableHeader().getDefaultRenderer();
jRenderer.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
%// Finalization:
jTable.invalidate();
end
Clicking the button then results in:
Several notes:
Here's the documentation of SwingConstants.
The two Parts are supposed to be two different solutions, but I noticed that it only works if both are present (I have no explanation for this).
I tried setting this in the figure creation function, but that didn't work (I have no explanation for this either).
Tested on MATLAB 2014a.

MATLAB: Returning variables from programmatic GUIs

I have been trying to program a GUI which is supposed to receive one variable as an input and perform several operations that generate another variable.
The GUI will have one pushbutton that closes the GUI.
I am not (and don't want) to use GUIDE.
Below, I provide a minimal working example of a GUI that simply adds one to the input variable. The "Done" push button closes the GUI but I cannot find out a way to export the variable to the workspace.
% Is this the correct way to initialize the function for what I am trying to do?
function outputVariable = exampleGUI(inputVariable)
% Initialize main figure
hdl.mainfig = figure();
% Add Button
hdl.addPushButton = uicontrol(hdl.mainfig, 'Units', 'normalized',
'Position', [0.05 0.6 0.3 0.25], 'String',
'Add One', 'Callback', #addOne);
% Done Button
hdl.donePushButton = uicontrol(hdl.mainfig, 'Units', 'normalized',
'Position', [0.65 0.6 0.3 0.25], 'String',
'Done', 'Callback', #done);
% Static text
hdl.sliceNoText = uicontrol(hdl.mainfig, 'Style', 'text',
'Fontsize', 16, 'Units', 'normalized',
'Position', [0.35 0.2 0.3 0.25]);
function addOne(~, ~, ~)
inputVariable = inputVariable + 1; % add one to the current inputVariable
set(hdl.sliceNoText, 'String', num2str(inputVariable)); % change static text
newVariable = inputVariable; % new variable to be exported
end
function done(~, ~, ~)
delete(hdl.mainfig); % close GUI
end
end
I would like to do something like:
In the workspace:
outputVariable = exampleGUI(inputVariable)
And after adding one to the input variable a certain number of times, I would push the "Done" pushbutton and the GUI would be closed and the workspace would contain both inputVariable and the outputVariable.
Thanks a lot.
fnery
This is an example of what you can do. There are a ton of things you can do to make this work with the functionality you want. Typically I don't like to have any variables in the whole function's workspace besides the inputs and outputs as well as the guihandles. I use setappdata and getappdata to store other variables and have them accessible to callbacks. This is up to you, but the following is an example of how you can make your simple gui work. The CloseRequestFcn allows you the handle what happens if the user just closes the gui. Hope this helps. In addition, the waitfor prevents the function from returning until the function is closed. If you want, you can also set the figure's 'WindowStyle' property to 'modal' to force the user to put an input before he can close the gui.
function outputVariable = exampleGUI(inputVariable)
% Any variables declared here will be accessible to the callbacks
% Initialize output
outputVariable = [];
% Initialize newVariable
newVariable = [];
% Initialize main figure
hdl.mainfig = figure('CloseRequestFcn',#closefunction);
% Add Button
hdl.addPushButton = uicontrol(hdl.mainfig, 'Units', 'normalized', 'Position',[0.05 0.6 0.3 0.25], 'String', 'Add One', 'Callback', #addOne);
% Done Button
hdl.donePushButton = uicontrol(hdl.mainfig, 'Units', 'normalized', 'Position',[0.65 0.6 0.3 0.25], 'String', 'Done', 'Callback', #done);
% Static text
hdl.sliceNoText = uicontrol(hdl.mainfig,'Style','text','Fontsize',16,'Units','normalized','Position',[0.35 0.2 0.3 0.25]);
function addOne(hObject,eventdata)
inputVariable = inputVariable+1; % add one to the current inputVariable
set(hdl.sliceNoText, 'String', num2str(inputVariable)); % change static text
newVariable = inputVariable; % new variable to be exported
end
function closefunction(hObject,eventdata)
% This callback is executed if the user closes the gui
% Assign Output
outputVariable = newVariable;
% Close figure
delete(hdl.mainfig); % close GUI
end
function done(hObject,eventdata)
% Assign Output
outputVariable = newVariable;
% Close figure
delete(hdl.mainfig); % close GUI
end
% Pause until figure is closed ---------------------------------------%
waitfor(hdl.mainfig);
end