在不使用 error() 的情况下以编程方式关闭 MATLAB GUI 应用程序

Closing MATLAB GUI application programmatically without using error()

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

有没有什么方法可以在不产生错误且不关闭整个 MATLAB 环境的情况下关闭应用程序(如 quit 和 exit)。 error() 是我的临时修复程序,但我不希望应用程序看起来像是崩溃了。

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

我也尝试过设置一个变量并在 while 循环之外设置关闭命令。

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() 函数的顶部。

您试过在收盘后休息一下吗(handles.window)。 break 将退出 while 循环,因此它不会再次命中该行。

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

这样 while 循环在关闭 window 后停止。如果除了关闭 window 之外还需要做更多清理工作,请设置错误标志 .

%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) 将 return true/false 没有 == 1

您的要求不是很清楚,但是您不能通过

保护关闭操作吗
if ishandle(handle.window)
   close(handle.window)
end

如果 window 已经被销毁,这将阻止尝试关闭。

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

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

我尝试将 return 语句与 close(handles.window) 结合使用,但收到错误消息:

Attempt to reference field of non-structure array.

Error in ==> gui>gui_OutputFcn at 292 varargout{1} = handles.output;

看来只需删除 292 上的那一行就可以解决问题。