Ryan Simmons
Ryan Simmons

Reputation: 883

MATLAB update waitbar

I am trying to implement a "percent complete" bar in a MATLAB program, using the waitbar function. However, I am having trouble with it. Here is the code that I have currently:


in my GUI

POSITION = [53.3333 20 188.5446 20];   
H = uiwaitbar(POSITION); 
for percentageDone = 0;
   uiwaitbar(H,percentageDone);
end 

then

function h = uiwaitbar(varargin)

if ishandle(varargin{1}) 
    ax = varargin{1}; 
    value = varargin{2}; 
    p = get(ax,'Child'); 
    x(3:4) = value; 
    set(p,'XData',x) 
    return 
end 

pos = varargin{1}; 
bg_color = [1 1 1]; 
fg_color = [0 .5 0]; 
h = axes('Units','pixels',... 
    'Position',pos,... 
    'XLim',[0 100],'YLim',[0 1],... 
    'XTick',[],'YTick',[],... 
    'Color',bg_color,... 
    'XColor',bg_color,'YColor',bg_color); 
patch([0 0 0 0],[0 1 1 0],fg_color,... 
    'Parent',h,... 
    'EdgeColor','none',... 
    'EraseMode','none'); 

end

Elsewhere in the script, I have a KeyPressFcn callback, in which the user inputs the answer to their questions. At the end of this callback, for every correct answer I want the waitbar to fill up a little. However, no matter what values I assign to percentageDone variable the waitbar in the GUI does not change at all.

Can anybody help me with this?

Upvotes: 0

Views: 4241

Answers (4)

nrz
nrz

Reputation: 10550

Do you first create the waitbar? Something like this:

h = waitbar(0, '1', 'Name', 'My progress bar', 'CreateCancelBtn', 'setappdata(gcbf, ''canceling'', 1)');

After that, to update the waitbar:

Edit: fixed bug with text output: percentageDone must be multiplied by 100.

waitbar(percentageDone, h, sprintf('Already %d percent ready!', 100*percentageDone));

Upvotes: 1

Amro
Amro

Reputation: 124543

I'm confused, you say you are using the builtin function WAITBAR, but then you seem to be implementing one yourself..

Anyway, here is a rather useless example that shows a custom progress bar. Just keep pressing "next" :)

function progressBarDemo()
    %# a figure and a plot area
    hFig = figure('Menubar','none');
    hAxPlot = axes('Parent',hFig, 'Box','on', ...
        'Units','normalized', 'Position',[0.1 0.2 0.8 0.6]);
    hLine = line('Parent',hAxPlot, 'XData',1:1000, 'YData',nan(1,1000), ...
        'Color','b');

    %# next button
    uicontrol('Style','pushbutton', 'String','next', ...
        'Callback',@buttonCallback);

    %# progress bar axis
    x = linspace(0, 1, 13+1);            %# steps
    hAx = axes('Parent',hFig, 'XLim',[0 1], 'YLim',[0 1], ...
        'XTick',[], 'YTick',[], 'Box','on', 'Layer','top', ...
        'Units','normalized', 'Position',[0 0.9 1 0.1]);
    hPatch = patch([0 0 x(1) x(1)], [0 1 1 0], 'r', 'Parent',hAx, ...
        'FaceColor','r', 'EdgeColor','none');
    hText = text(0.5, 0.5, sprintf('%.0f%%',x(1)*100), ...
        'Parent',hAx, 'Color','w', 'BackgroundColor',[.9 .5 .5], ...
        'HorizontalAlign','center', 'VerticalAlign','middle', ...
        'FontSize',16, 'FontWeight','bold');
    counter = 2;

    %# next button callback function
    function buttonCallback(src,evt)
        %# draw another random plot
        set(hLine, 'YData',cumsum(rand(1000,1)-0.5))

        %# update progress bar
        set(hPatch, 'XData',[0 0 x(counter) x(counter)])
        set(hText, 'String',sprintf('%.0f%%',x(counter)*100))

        %# terminate if we have reached 100%
        counter = counter + 1;
        if counter > numel(x)
            set(src, 'Enable','off', 'String','Done')
            return
        end
    end
end

screenshot

Upvotes: 1

MBL
MBL

Reputation: 1227

Have you tried using Progressbar from the File Exchange? It might save you a lot of hassle. I've always had good results with it.

Upvotes: 1

Peter
Peter

Reputation: 14927

You're probably just missing a drawnow call after setting the XData property, to force a flush of the graphics events queue. If this does not fix your problem, then include enough code to reproduce the symptoms.

Upvotes: 1

Related Questions