【问题标题】:checkbox object IF statement does not recognize the variables in MATLAB GUIDE复选框对象 IF 语句无法识别 MATLAB GUIDE 中的变量
【发布时间】:2018-05-23 11:23:42
【问题描述】:

每个人。可能,我在这里犯了一个完全愚蠢的错误,但问题是:

我使用 MATLAB GUIDE 制作了一个 GUI。我在 GUI 中添加了一些复选框,这样如果选中它们就会在 axes2 上绘制一些东西,否则将其删除。如果你问的话,会有其他的情节,所以有等待。它的工作原理是这样的:

function checkbox1_Callback(hObject, eventdata, handles)
% Hint: get(hObject,'Value') returns toggle state of checkbox1
if get(hObject, 'Value') == 1
    axes(handles.axes2);
    x = handles.x;
    distanceX_Plot = evalin('base', 'CAN2_MPC_C19_Dist_X_VehObj0_Cval_MPC');
    hold on;
    distanceX_Plotted = plot(x,distanceX_Plot, 'r');
    legend('Distance X')
    hold off; 
else 
    delete(distanceX_Plotted);
end

但 IF 部分中的 distanceX_Plotted 带有下划线,表示变量可能未使用,而 ELSE 语句中的第二个 distanceX_Plotted 表示该变量可能在定义之前使用。

完整的错误是这样的:

未定义的函数或变量'distanceX_Plotted'。

无标题错误>checkbox1_Callback (line 224) delete(distanceX_Plotted);

gui_mainfcn 中的错误(第 95 行) feval(varargin{:});

无标题错误(第 42 行)gui_mainfcn(gui_State, varargin{:});

matlab.graphics.internal.figfile.FigFile/read 中的错误>@(hObject,eventdata)untitled('checkbox1_Callback',hObject,eventdata,guidata(hObject)) 评估 UIControl 回调时出错

感谢您的帮助。

【问题讨论】:

    标签: matlab user-interface plot axes


    【解决方案1】:

    您当前的功能将:

    1. 创建一组轴并绘制数据。此图可通过句柄 distanceX_Plotted 访问。

    2. 尝试删除不存在的 distanceX_Plotted,因为它没有进入 if-else 块的第一部分。

    如果你想在坐标轴handle.axis2 上绘制一些东西或者删除它,你需要在想要的坐标轴上绘制,或者删除坐标轴(而不是图):

    function checkbox1_Callback(hObject, eventdata, handles)
    % Hint: get(hObject,'Value') returns toggle state of checkbox1
    if get(hObject, 'Value') == 1
        x = handles.x;
        distanceX_Plot = evalin('base', 'CAN2_MPC_C19_Dist_X_VehObj0_Cval_MPC');
        hold on;
        distanceX_Plotted = plot(x,distanceX_Plot, 'r','Parent', handles.axes2); % modified
        legend('Distance X')
        hold off; 
    else 
        delete(handles.axes2); % modified 
    end
    

    编辑:如果您想删除您绘制的最后一行,请将其写入else 块:

    if ~isempty(handles.axes2.Children)
        delete(handles.axes2.Children(end));
    end
    

    它将删除您在axes2 上打印的最后一行。

    【讨论】:

    • 我还没有机会测试它,但似乎这就是问题所在。非常感谢您,但我还有一个问题:如果我想删除该特定图而不是整个轴 2,以防其他函数也在轴 2 上绘制某些东西,我该怎么办?
    • 您可以在删除之前使用exist('distanceX_Plotted')检查元素是否存在,并且您可以通过输入handles.axes2.Children来获取轴的子元素列表。这使您可以决定要删除其中的哪些元素(如果它们存在)(例如:最后一个 line 元素)。
    • 感谢您的回答。 if 语句有问题。我在代码中的“hold off”行放置了一个断点,然后检查了存在('distanceX_Plotted'),它按预期返回了 1。但是当我继续运行我的程序时,如果退出该 if 语句,我的程序存在('distanceX_Plotted')开始返回 0。我真的没有得到这种行为,我想我在这里遗漏了一些非常微不足道的东西。
    • 由于我忘记指定我只想删除轴中的那条线,所以我会接受并接受这个作为答案。
    猜你喜欢
    • 1970-01-01
    • 2012-02-17
    • 2017-09-05
    • 2020-02-15
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    • 1970-01-01
    • 2019-08-15
    相关资源
    最近更新 更多