0

我正在尝试使用 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 回调,用户在其中输入问题的答案。在此回调结束时,对于每个正确答案,我希望等待栏填满一点。但是,无论我为 percentDone 变量分配什么值,GUI 中的等待栏都不会发生任何变化。

有人可以帮我吗?

4

4 回答 4

1

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

于 2012-06-15T15:10:12.840 回答
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

截屏

于 2012-06-16T22:01:02.147 回答
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));
于 2012-06-15T16:21:31.813 回答
1

您是否尝试过使用File Exchange 中的Progressbar ?它可能会为您节省很多麻烦。我一直有很好的结果。

于 2012-06-15T16:04:34.503 回答