MATLAB更新等待栏

时间:2012-06-15 14:28:59

标签: matlab user-interface progress-bar

我正在尝试使用waitbar函数在MATLAB程序中实现“完成百分比”栏。但是,我遇到了麻烦。这是我目前的代码:


在我的GUI中

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

然后

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

在脚本的其他地方,我有一个KeyPressFcn回调,用户在其中输入问题的答案。在回调结束时,对于每个正确答案,我希望等待栏填满一点。但是,无论我分配给percentageDone变量的值是什么,GUI中的等待栏都不会发生变化。

有人可以帮我吗?

4 个答案:

答案 0 :(得分:1)

在设置XData属性后,您可能只是错过了drawnow调用,以强制刷新图形事件队列。如果这不能解决您的问题,请提供足够的代码来重现症状。

答案 1 :(得分:1)

您是否尝试过使用文件交换中的Progressbar?它可能会为您节省很多麻烦。我一直都有很好的成绩。

答案 2 :(得分:1)

您是先创建waitbar吗?像这样:

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

之后,要更新等待栏:

编辑:修正了包含文字输出的错误: percentageDone 必须乘以100。

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

答案 3 :(得分:1)

我很困惑,你说你正在使用内置函数WAITBAR,但是你似乎自己实现了一个...

无论如何,这是一个相当无用的示例,显示了自定义进度条。只需按“下一步”:)

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