MATLAB GUI - how to make a button change a value then close window

I am doing data processing from experiments, some data cannot be detected and given a 'type'. For this data I have made a GUI that plots the relevant data and allows the user to manually specify what data 'type' it is by means of 5 buttons.
The idea is this: if the data cannot be assigned a 'type' by the script a window opens asking for user input. Once the user presses the button indicating the 'type' a number is assigned/saved into the parent script and the window is closed.
Everything is working except saving the 'type' (integer as identifier) such that the parent script can read this. See below for a simplified version of what I have done so far:
xCur = 1:1000;
yCur = 1:1000;
i = 1;
[fig,currentExpType] = guiExpType(xCur,yCur);
waitfor(fig);
disp(['Experiment series ' num2str(i) ' is type ' num2str(currentExpType) ' (user input)']);
function [fig,expType] = guiExpType(xCur, yCur)
expType = [];
% prompt window
fig = uifigure;
fig.Name = "Determine Experiment Type";
fig.Position = [350 300 1200 675];
% determine prompt layout
gl = uigridlayout(fig,[9 2]);
gl.RowHeight = {40,30,40,40,40,40,40};
gl.ColumnWidth = {'1x',200};
% initiate modules in prompt
ttl = uilabel(gl,'Text','Unable to detect experiment type, please define with the buttons below.','FontSize',20,'FontWeight','bold');
lbl = uilabel(gl,'Text','Experiment type shown:');
axX = uiaxes(gl);
axY = uiaxes(gl);
btn1 = uibutton(gl,'Text','Positive x perturbation','ButtonPushedFcn',@(src,event)btn_callback(src,event,1));
btn2 = uibutton(gl,'Text','Negative y perturbation','ButtonPushedFcn',@(src,event)btn_callback(src,event,2));
btn3 = uibutton(gl,'Text','Negative x perturbation','ButtonPushedFcn',@(src,event)btn_callback(src,event,3));
btn4 = uibutton(gl,'Text','Positive y perturbation','ButtonPushedFcn',@(src,event)btn_callback(src,event,4));
btn5 = uibutton(gl,'Text','Undefined, skip this.','ButtonPushedFcn',@(src,event)btn_callback(src,event,5));
% layout of modules
% title
ttl.Layout.Row = 1;
ttl.Layout.Column = [1 2];
% label
lbl.Layout.Row = 2;
lbl.Layout.Column = 2;
% button expType1
btn1.Layout.Row = 3;
btn1.Layout.Column = 2;
% button expType2
btn2.Layout.Row = 4;
btn2.Layout.Column = 2;
% button expType3
btn3.Layout.Row = 5;
btn3.Layout.Column = 2;
% button expType4
btn4.Layout.Row = 6;
btn4.Layout.Column = 2;
% button undefined
btn5.Layout.Row = 7;
btn5.Layout.Column = 2;
% x plot
axX.Layout.Row = [2 4];
axX.Layout.Column = 1;
% y plot
axY.Layout.Row = [5 7];
axY.Layout.Column = 1;
% configure modules
axX.Title.String = 'Current Experiment Cursor x-data';
axY.Title.String = 'Current Experiment Cursor y-data';
% plot data on axes
plot(axX, xCur)
plot(axY, yCur)
% callback functions for buttons
function btn_callback(src,event,newValue)
expType = newValue;
closereq();
end
end
I have tried a whole bunch of different things but am losing inspiration, I don't think I fully understand the way the the nested function definition @(...,...)function(...,...) works. I do understand that in the callback I am defining a variable and then immediately closing the figure, I have tried using the set() and get() functions but haven't been successful.
Any help will be greatly appreciated.

답변 (1개)

Rik
Rik 2022년 1월 20일
편집: Rik 2022년 1월 20일

0 개 추천

If you add uiwait before the nested function, this will pause execution of the main function. This will give the user time to click the button. Since clicking the button closes the figure, uiresume is called implicitly there.
For general advice and examples for how to create a GUI, have look at this thread.
The reason your current setup doesn't work is that your function has already returned before the callback has had a chance to change the value.

댓글 수: 1

Did my answer solve the problem? If so, please consider marking it as accepted answer. If not, feel free to post a comment with your remaining issues.

댓글을 달려면 로그인하십시오.

카테고리

도움말 센터File Exchange에서 Develop Apps Programmatically에 대해 자세히 알아보기

제품

릴리스

R2021a

태그

질문:

2022년 1월 19일

댓글:

Rik
2022년 1월 29일

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by