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.

对于每个图像,GUI 在函数“mainGUI”中创建(但每次都会显示一个 GUI,直到用户按下“下一步”)。

我想做接下来的事情:

如果用户按下 GUI 中的关闭按钮,我想停止显示其他 GUI-s 并设置“数据 = 0”。然后,我将检查返回的元素('mydata')是什么,如果它等于 0,我将知道用户关闭了 GUI,我将根据需要采取行动。

我试图通过“cmdClose_Callback”来做到这一点,但它不起作用。

假设“文件”=两个图像,所以这是第一个图像的 GUI。

我按下关闭按钮:

在此处输入图像描述

尽管关闭了第一个图像的 GUI,但得到了第二个图像的 GUI。

在此处输入图像描述

我希望当我关闭 GUI 时,其他 GUI-s 不会出现。

这是我的代码:

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

如果“文件”有两个图像,我按下第一个图的“下一步”按钮,在第二个图中我关闭,我得到:

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

只需在创建第二个图形之前检查是否hFig1是有效句柄。

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

我成功了!

我使用 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 关闭图窗。

您可能希望在函数close(hFig)末尾添加一个调用。mainGUI

于 2012-10-03T12:34:39.917 回答