2

ファイル (ファイルのリスト) とオプション (後で説明します) の 2 つの要素を取得する GUI を作成しました。

以下の関数を呼び出す関数があります。

// asume that this is my 'options'
options{1} = {'Treatment', 't1', 't2'};
options{2} = {'Tree', '1', '2'};
options{3} = {'Replica', 'r1', 'r2', 'r3'};

// asume that this is my 'files' (may be more than 2 images
files{1} = 'C:\Documents and Settings\erezalon\Desktop\gib_proj_02.10.12\fina3_32bit\IMG_4640.JPG';
files{2} = 'C:\Documents and Settings\erezalon\Desktop\gib_proj_02.10.12\fina3_32bit\grapes03.jpg';


mydata = mainGUI(options, files).

// here I want to check 'mydata'. if it is equal to zero or not.

画像ごとに、関数「mainGUI」で GUI が作成されます (ただし、ユーザーが「次へ」を押すまで、毎回 1 つの GUI が表示されます)。

次のことをしたい:

ユーザーが GUI の閉じるボタンを押した場合、他の GUI の表示を停止し、「データ = 0」に設定したいと考えています。次に、返された要素 (「mydata」) を確認し、それが 0 の場合、ユーザーが GUI を閉じたことを認識し、必要に応じて行動します。

「cmdClose_Callback」でこれを実行しようとしましたが、うまくいきません。

'files' = 2 つの画像と仮定すると、これは最初の画像の GUI になります。

閉じるボタンを押します。

ここに画像の説明を入力

最初の画像のGUIを閉じたにもかかわらず、2番目の画像のGUIを取得しました。

ここに画像の説明を入力

GUI を閉じたときに、他の GUI が表示されないようにしたいです。

これは私のコードです:

function  data = mainGUI(options, files)
 %# current options
 j = 1;
 ops = cellfun(@(c) c(1), options, 'Uniform',false);
 data{j} =  [ops{1:length(ops)}];
 j = j + 1;


 options = cellfun(@(c) c(2:1:end), options, 'Uniform',false);
 clear ops;
 ops = cellfun(@(c) c(1), options, 'Uniform',false);
 opts =  [ops{1:length(ops)}];

%# create main figure, with plot and options button
hFig = figure('Name','window 1','Visible','Off');
a = 1
callback

%# options button callback function
function callback(o,e)
    a = 2
    %# save current options (sharing data between the two GUIs)
    setappdata(hFig, 'opts',opts);

    %# display options dialog and wait for it

    for k=1: length(files)

            hOptsGUI = secondaryGUI(hFig, options, k, length(files));

            img = imread(files{k});  %# Read the data from image file data
            hAxes = axes('Parent',hOptsGUI,'Units','pixels','Position',[362 242 424 359]);  %#   so the position is easy to define
            image(img,'Parent',hAxes);  %# Plot the image
            set(hAxes,'Visible','off');          %# Turn the axes visibility off

            a = 3

            waitfor(hOptsGUI);

            a = 4
            %# get new options, and update plot accordingly
            opts = getappdata(hFig, 'opts');
             data{j} = opts;
             j = j + 1;
    end
end

end

function hFig = secondaryGUI(hParentFig, options, k, num_files)
%# create figure

a = 5


hFig = figure('Name','Step 3 of 4: Choose data for each image','Menubar','none', 'Resize','off', ...
    'WindowStyle','modal', 'Position',[300 300 1150 600], 'CloseRequestFcn',@cmdClose_Callback);
set(gcf,'NumberTitle','off')
movegui(hFig, 'center');



options = cellfun(@(c) c(end:-1:1), options, 'Uniform',false);
num = length(options);

%# get saved settings
selected = getappdata(hParentFig, 'opts');
a = 6
%# top/bottom panels
hPanBot = uipanel('Parent',hFig, 'BorderType','none', ...
    'Units','normalized', 'Position',[0 0.0 1 0.2]);

hPanTop = uipanel('Parent',hFig, 'BorderType','none', ...
    'Units','normalized', 'Position',[0 0.2 1 0.2]);



%# buttongroups in top panel
hBtnGrp = zeros(1,num);
width = 1/num;
for i=1:num
    %# create button group
    hBtnGrp(i) = uibuttongroup('Parent',hPanTop, ...
        'Units','normalized', 'Position',[(i-1)*width 0 width 1]);
    %# populate it with radio buttons
    height = 1./numel(options{i});
    for j=1:numel(options{i})
        h = uicontrol('Parent',hBtnGrp(i), 'Style','Radio', ...
            'Units','normalized', 'Position',[0.05 (j-1)*height 0.9 height], ...
            'String',options{i}{j});
        %# set initially selected values
        if strcmp(selected{i},options{i}{j})
            set(hBtnGrp(i), 'SelectedObject',h)
        end
    end
end

if k ~= num_files
%# save button in bottom panel
uicontrol('Parent',hPanBot, 'Style','pushbutton', ...
    'Units','normalized', 'Position',[0.3 0.2 0.4 0.2], ...
    'String','next', 'Callback',@callback);

else
    uicontrol('Parent',hPanBot, 'Style','pushbutton', ...
    'Units','normalized', 'Position',[0.3 0.2 0.4 0.2], ...
    'String','start', 'Callback',@callback);
end


%# save button callback function
function callback(o,e)
    a = 7
    %# get selected values
    hObjs = get(hBtnGrp(:), 'SelectedObject');
    vals = get(cell2mat(hObjs),{'String'});

    %# update settings
    setappdata(hParentFig, 'opts',vals);


    close(hFig)
    a = 8
end

 function cmdClose_Callback(hObject,varargin)
    disp(['Close Request coming from: ',get(hObject,'Type')]);
    a = 9

    %do cleanup here
    delete(hFig);
    a = 10

 end
end

「ファイル」に 2 つの画像がある場合、最初の図の「次へ」ボタンを押し、2 番目の図を閉じると、次のようになります。

a = 1
a = 2
a = 5
a = 6
a = 3
a = 7
Close Request coming from: figure
a = 9
a = 10
a = 8
a = 4
a = 5
a = 6
a = 3
Close Request coming from: figure
a = 9
a = 10
a = 4

行の上: hOptsGUI = secondaryGUI(hFig, options, k, length(files)); 線を入れてみました。行をテストするために、適合メッセージを出力します。

if (ishandle(hFig))
     disp('exists');
else disp('was closed');
end;

しかし、うまくいきません:/

ユーザーが閉じる GUI ごとに、次のコールバックが呼び出されます。

function callback(o,e)

    %# get selected values
    hObjs = get(hBtnGrp(:), 'SelectedObject');
    vals = get(cell2mat(hObjs),{'String'});

    %# update settings
    setappdata(hParentFig, 'opts',vals);

    %# close options dialog
    close(hFig)

end

したがって、このコールバックが呼び出されたかどうかを次の「for ループ」で知る必要があります。

for k=1: length(files)

どうやってやるの?

4

3 に答える 3

2

hFig12 番目の Figure を作成する前に、 が有効なハンドルかどうかを確認してください。

if ishandle(hFig1)
    hFig2 = figure(...)
else
    return;      % do something else
end

必要に応じて繰り返します。


function data = mainGUI(options, files)
    % ...
    % create main figure, with plot and options button
    hFig = figure('Name','window 1','Visible','Off');

    complete = callback;
    if complete == 1
        data = data;  
    else 
        data = 0;
    end

% options button callback function
function complete = callback(o,e)
    %save current options (sharing data between the two GUIs)
    setappdata(hFig, 'opts',opts);

    % display options dialog and wait for it
    complete = 0;
    for k = 1 : length(files)
        hOptsGUI = secondaryGUI(hFig, options, k, length(files));
        % ...
    end
    % we reached the end of the loop!
    complete = 1;
end
于 2012-10-03T14:20:02.750 に答える
1

成功しました!

2 番目のコールバックが呼び出されたかどうかを知るために、setappdata と getappdata を使用しました。

@Derek 、Derek、あなたの助けと私のために多くの時間を費やしてくれてありがとう!

function  data = mainGUI(options, files)
 %# current options
 j = 1;
 ops = cellfun(@(c) c(1), options, 'Uniform',false);
 data{j} =  [ops{1:length(ops)}];
 j = j + 1;


 options = cellfun(@(c) c(2:1:end), options, 'Uniform',false);
 clear ops;
 ops = cellfun(@(c) c(1), options, 'Uniform',false);
 opts =  [ops{1:length(ops)}];

%# create main figure, with plot and options button
hFig = figure('Name','window 1','Visible','Off');
callback


%# options button callback function
function callback(o,e)
    %# save current options (sharing data between the two GUIs)
    setappdata(hFig, 'opts',opts);

    %# display options dialog and wait for it

    for k=1: length(files)
            hOptsGUI = secondaryGUI(hFig, options, k, length(files));

            img = imread(files{k});  %# Read the data from your image file
            hAxes = axes('Parent',hOptsGUI,'Units','pixels','Position',[362 242 424 359]);  %#   so the position is easy to define
            image(img,'Parent',hAxes);  %# Plot the image
            set(hAxes,'Visible','off');          %# Turn the axes visibility off

            out = 'FALSE';
            setappdata(hFig,'some_var',out);
            % show the images
            %%Im = imread(files{k});
            %%AxesH = axes('Units', 'pixels', 'position', [0.5, 10, 400, 260], 'Visible', 'off');
            %%image('Parent', AxesH, 'CData', Im); %# add other property-value pairs as needed

            waitfor(hOptsGUI);

            some_other_var = getappdata(hFig,'some_var');

            if (strcmp(some_other_var, 'OK') == 1)
                 %# get new options, and update plot accordingly
                opts = getappdata(hFig, 'opts');
                data{j} = opts;
                j = j + 1;
            else
                k = length(files);
                data = 0;
                return;
            end;
    end
end
end

function hFig = secondaryGUI(hParentFig, options, k, num_files)
%# create figure


hFig = figure('Name','Step 3 of 4: Choose data for each image','Menubar','none', 'Resize','off', ...
    'WindowStyle','modal', 'Position',[300 300 1150 600]);
set(gcf,'NumberTitle','off')
movegui(hFig, 'center');



options = cellfun(@(c) c(end:-1:1), options, 'Uniform',false);
num = length(options);

%# get saved settings
selected = getappdata(hParentFig, 'opts');

%# top/bottom panels
hPanBot = uipanel('Parent',hFig, 'BorderType','none', ...
    'Units','normalized', 'Position',[0 0.0 1 0.2]);

hPanTop = uipanel('Parent',hFig, 'BorderType','none', ...
    'Units','normalized', 'Position',[0 0.2 1 0.2]);



%# buttongroups in top panel
hBtnGrp = zeros(1,num);
width = 1/num;
for i=1:num
    %# create button group
    hBtnGrp(i) = uibuttongroup('Parent',hPanTop, ...
        'Units','normalized', 'Position',[(i-1)*width 0 width 1]);
    %# populate it with radio buttons
    height = 1./numel(options{i});
    for j=1:numel(options{i})
        h = uicontrol('Parent',hBtnGrp(i), 'Style','Radio', ...
            'Units','normalized', 'Position',[0.05 (j-1)*height 0.9 height], ...
            'String',options{i}{j});
        %# set initially selected values
        if strcmp(selected{i},options{i}{j})
            set(hBtnGrp(i), 'SelectedObject',h)
        end
    end
end

if k ~= num_files
%# save button in bottom panel
uicontrol('Parent',hPanBot, 'Style','pushbutton', ...
    'Units','normalized', 'Position',[0.3 0.2 0.4 0.2], ...
    'String','next', 'Callback',@callback);
else
    uicontrol('Parent',hPanBot, 'Style','pushbutton', ...
    'Units','normalized', 'Position',[0.3 0.2 0.4 0.2], ...
    'String','start', 'Callback',@callback);
end
%# save button callback function
function callback(o,e)
    out = 'OK';
    setappdata(hParentFig,'some_var',out);
    %# get selected values
    hObjs = get(hBtnGrp(:), 'SelectedObject');
    vals = get(cell2mat(hObjs),{'String'});

    %# update settings
    setappdata(hParentFig, 'opts',vals);

    %# close options dialog
    close(hFig)
end

function cmdClose_Callback(hObject,varargin)  
    %do cleanup here
    delete(hFig);
end
end
于 2012-10-04T14:13:35.847 に答える
0

最初の GUI から Figure を閉じる呼び出しはありません。

close(hFig)関数の最後に呼び出しを追加することができmainGUIます。

于 2012-10-03T12:34:39.917 に答える