0

ウェイトバー関数を使用して、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

4 に答える 4

1

drawnowグラフィックイベントキューのフラッシュを強制するために、XDataプロパティを設定した後に呼び出しが欠落している可能性があります。これで問題が解決しない場合は、症状を再現するのに十分なコードを含めてください。

于 2012-06-15T15:10:12.840 に答える
1

ファイル交換からプログレスバーを使用してみましたか?それはあなたに多くの手間を省くかもしれません。私はいつもそれで良い結果を出しました。

于 2012-06-15T16:04:34.503 に答える
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

混乱しています。組み込み関数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 に答える