我正在尝试使用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中的等待栏都不会发生变化。
有人可以帮我吗?
答案 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