matlab:如果用户按下关闭按钮,则关闭gui

matlab:如果用户按下关闭按钮,则关闭gui,matlab,user-interface,Matlab,User Interface,我制作了一个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

我制作了一个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,直到用户按下“next”)

我想做下一件事:

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

我尝试通过“cmdClose\u回调”执行此操作,但无效

假设“文件”=两个图像,因此这是第一个图像的GUI

我按下关闭按钮:

并获得第二个图像的GUI,尽管关闭了第一个图像的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
如果“文件”有两个图像,我按下第一个图形的“下一步”按钮,在第二个图形中关闭,我得到:

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)); 我试着写几行。为了测试这些行,我打印了一条fit消息:

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 k=1: length(files)
所以我只需要在下一个“for循环”中知道是否调用了此回调:

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 k=1: length(files)

我如何才能做到这一点?

没有从第一个GUI关闭图形的调用


您可能需要在
mainGUI
函数的末尾添加一个调用
close(hFig)

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

if ishandle(hFig1)
    hFig2 = figure(...)
else
    return;      % do something else
end
根据需要重复


我成功了

为了知道是否调用了第二个回调,我使用了setappdata和getappdata

@德里克,德里克,非常感谢你的帮助,感谢你为我花了很多时间

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

delete(hFig)
对您有帮助吗?不,没有:/I我试图将delete(hFig)放在mainGUI函数的“callback”行下面。谢谢你的努力,你确定吗?我认为它无论如何都不是一个有效的句柄,因为该句柄可以通过“关闭”按钮或当用户按下“下一步”按钮时关闭。@Alonhmiel不确定我是否理解您的意图。请参阅更新的代码。@AlonShmiel如果用户关闭了图1,则我们不创建图2。这就是你想要的吗?是的,我正在尝试你的建议,如果它有效或无效,我会让你拒绝。非常感谢。我想我不知道去哪里查。。我在“callback”的“for循环”中检查了它,在下面一行:hOptsGUI=secondaryGUI(hFig,options,k,length(files));