How to merge the waitbar into UIcontrol GUI
3 views (last 30 days)
Show older comments
Statisticalbeginner
on 10 Feb 2016
Commented: Geoff Hayes
on 1 Mar 2016
I have a UIcontrol program like below
function [] = MyGui()
S.fh = figure('units','pixels',...
'position',[200 200 800 800],...
'menubar','none',...
'name','GUI_2',...
'numbertitle','off',...
'resize','off');
S.ls = uicontrol('Style','text',...
'String','INTERACTIVE PARAMETER UPDATE',...
'FontWeight','bold',...
'FontSize', 12,...
'position',[200 700,400,50]);
S.pb1 = uicontrol('style','push',...
'units','pix',...
'position',[350 400 100 40],...
'fontsize',12,...
'string','Start',...
'callback',{@start_call});
S.ed = uicontrol('style','edit',...
'unit','pix',...
'position',[220 300 100 40],...
'fontsize',12,...
'string','New String');
S.pb2 = uicontrol('style','push',...
'units','pix',...
'position',[500 300 100 40],...
'fontsize',12,...
'string','Add String',...
'callback',{@update_call,S});
%Function for getting the nTs value and passing into encdec
function [] = update_call(varargin)
% Callback for pushbutton, reads new string from edit box.
S = varargin{3};
addstr = str2double(get(S.ed,'string')); % The string to add to the stack.
if ~strcmp(addstr,'NaN')
if addstr > 0 && addstr < 100
addstr
%pass the value to encdec
else
msgbox('Please enter a number between 1 and 100','WARNING')
end
end
%Function for starting the main program
function [] = start_call(varargin)
MainProgram
I am doing following tasks 1. I press the start and "MainProgram" runs. (Its a long running process) 2. I put some value in edit text box and press the update 3. The value will be passed onto the "MainProgram" for update.
Now I have two questions 1. there is a waitbar in MainProgram and how to merge that in main GUI (Instead of having a seperate pop-up). (start_call) 2. If user enters "addstr" value and press update, how can I interrupt MainProgram to take this addstr value for further processing ?
Thanks. 2.
4 Comments
Accepted Answer
Geoff Hayes
on 29 Feb 2016
Statisticalbeginner - rather than using a slider to record your progress, consider using an axes object which you would then draw an image representing the progress completed. For example, your GUI may have an axes for plotting something, a push button to kick-off the processing, and another axes to record progress. If you give your GUI a unique Tag (see the properties inspector for your GUI) and set its HandleVisibility property to on, then your main program can look for this GUI and update the axes that has been designated as the wait (or progress) bar.
function updateWaitBar
% find the GUI whose tag is GuiWaitBarExample (GUI HandleVisibility
% property must be set to on)
hGui = findobj('Tag','GuiWaitBarExample');
if ~isempty(hGui)
% get the GUI handles structure
handles = guidata(hGui);
% axes2 is the waitbar
if ~isempty(handles) && isfield(handles,'axes2')
% if the waitBarImg doesn't exist, then create it and the
% image graphics object
if ~isfield(handles,'waitBarImg')
handles.waitBarImg = uint8(ones(1,maxIters,3)*255);
handles.hWaitBarImg = image(handles.waitBarImg,'Parent',handles.axes2);
end
% reset to a white background
if k == 1
handles.waitBarImg(:,:,:) = 255;
end
% set the progress complete portion of the wait bar
handles.waitBarImg(:,k,1) = 255; % red
handles.waitBarImg(:,k,2) = 0; % green
handles.waitBarImg(:,k,3) = 0; % blue
% update the "drawn" image graphic object with the new data
set(handles.hWaitBarImg,'CData',handles.waitBarImg);
% ensure that the axes and ticks are hidden
bgClr = get(handles.GuiWaitBarExample, 'Color');
set(handles.axes2,'XTick',[],'YTick',[],'XTickLabe',[],'YTickLabel',[],'XColor',bgClr,'YColor',bgClr);
% save the updated handles structure
guidata(hGui,handles);
end
end
end
end
Note that the above function is nested within the parent main program GuiWaitBarExampleProg and so has access to the k and maxIters defined there. Run the attached GUI, press the button, and see what happens!
1 Comment
Geoff Hayes
on 1 Mar 2016
I'm not sure what you mean by variable. You can set maxIters to whatever you want when this main program is called. I just set it to 100 as an example. If it needs to be something else it can be, but you will have to set it to that new (variable) value based on other inputs like your B.
More Answers (0)
See Also
Categories
Find more on Loops and Conditional Statements in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!