以编程方式关闭MATLAB GUI应用程序而不使用error()

时间:2015-07-14 15:04:51

标签: matlab matlab-guide

我正在努力使应用程序/ gui完全关闭,如果用户单击取消或退出输入对话框。我的gui的标记名为window但是使用close(handles.window);会导致程序循环一次,然后(在用户点击取消或再次退出后)到达close(handles.window);行,当然,导致无效的图形句柄错误。

是否有任何方法可以关闭应用程序而无需产生错误而不关闭整个MATLAB环境(如退出和退出)。错误()是我的临时修复,但是我不希望应用程序看起来像是崩溃了。

我试过了所有但是没有效果。值得注意的是,如果用户点击取消或退出,应用程序确实会进入if语句。

我也尝试过设置变量并在while循环之外使用close命令。

apa = getAvailableComPort();
apList = '';

i = 0;
for idx = 1:numel(apa)
    if i == 0
        apList = apa(idx);
    else
        apList = strcat(apList, ', ', apa(idx));
    end
    i = i + 1;
end

prompt = {'Enter COM PORT:'};
title = 'COM PORT';
num_lines = 1;
def = apList;
COM_PORT = inputdlg(prompt,title,num_lines,def); 
% Keep asking for a COM PORT number until user gives a valid one
while sum(ismember(apa, COM_PORT)) == 0 % If the COM port comes up in the available COM ports at least once
    % If user clicks cancel, close the guide
    if isempty(COM_PORT) == 1
        error('Closing...'); % HERE IS THE PROBLEM
    end
    prompt = {'Invalid COM PORT'};
    title = 'Invalid COM PORT';
    COM_PORT = inputdlg(prompt,title,num_lines,def);    
end

功能getAvailableComPort位于http://www.mathworks.com/matlabcentral/fileexchange/9251-get-available-com-port

这整段代码位于gui_OpeningFcn()函数的顶部。

3 个答案:

答案 0 :(得分:1)

你有没有尝试在收盘后休息一下(handles.window)。中断将退出while循环,因此它不会再次击中该行。

if isempty(COM_PORT) == 1
    close(handles.window)
    break
end

这样,关闭窗口后while循环停止。如果你需要做更多的清理,除了关闭窗口,然后设置一个错误标志。

%Above while loop
errorFlag = False;

if isempty(COM_PORT) == 1
    close(handles.window)
    errorFlag = True;
    break
end

%OutSide of While loop
if errorFlag
    %Do some more clean-up / return / display an error or warning
end

另外,仅供参考,您不需要执行isempty(COM_PORT) == 1 ... isempty(COM_PORT)将返回true / false而不使用== 1

答案 1 :(得分:1)

您的要求并不是很清楚,但您无法保护关闭操作

if ishandle(handle.window)
   close(handle.window)
end

如果窗口已被破坏,这将阻止尝试关闭。

答案 2 :(得分:0)

为什么不使用简单的returnmsgbox来通知用户点击了取消?

if isempty(COM_PORT)
    uiwait(msgbox('Process has been canceled by user.', 'Closing...', 'modal'));
    delete(your_figure_handle_here);
    return;
end