0

最初,我在 GUI 中创建一个带有两个按钮(btnStart、btnNext)和一个轴(P_axes)的图形。对于以上两个按钮,我正在使用回调函数。

在第一个按钮回调函数中

function btnStart_callback(hObject,eventdata ,handles)
   load MRI;
   d = D(:,:,1);
   handles.Img = imshow(d,'Parent' , P_axes);
   setappdata(handles.figure1 , 'Indx' , 1)
   setappdata(handles.figure1 , 'Data' , D)
end

在第二个按钮回调函数中

function btnNext_callback(hObject,eventdata ,handles)
         indx = getappdata(handles.figure1 , 'Indx');
         D= getappdata(handles.figure1 , 'Data');
         d = D(:,:,indx+1);
         set(handles.Img , 'CData',d);
         setappdata(handles.figure1 , 'Indx' , indx+1);
end

在第二个回调函数中,我得到了一个 set(handles.Img , 'CData',d);

错误是“无效或已删除的对象。”

为什么会发生此错误以及如何解决?

4

2 回答 2

1

没有看到上下文,很难绝对确定你在做什么。重要的是,这些函数是定义在相同的文件中还是不同的文件中?似乎确实存在一个明显的问题,可能会导致您看到的错误:

function btnStart_callback(hObject,eventdata ,handles)
   load MRI;
   d = D(:,:,1);
   handles.Img = imshow(d,'Parent' , P_axes);
   setappdata(handles.figure1 , 'Indx' , 1)
   setappdata(handles.figure1 , 'Data' , D)
end

上面的,handles在函数结束时传入,修改,然后丢弃。如果函数是在不同的文件中定义的,那么您存储的那个值.Img将永远不会再被看到,这就是为什么您的第二个回调在您尝试使用它时抛出错误的原因。

您正在使用appdata在两个函数之间共享数据的方法。这肯定会奏效,但如果您使用这种方法,您还需要共享handles.Img.

我喜欢的另一种方法是将这两个回调作为嵌套函数放置在代表您的“应用程序”(创建 GUI 等)的主文件中。这样,它们可以在文件范围级别共享数据(在根函数中定义的变量在嵌套函数中可见)并且您不需要对appdata函数的所有调用。

您的申请将采用以下形式:

function myapp

% define a variable here
my_handle = [];

    function callback1(h, e)

        % and it is visible here
        my_handle = gcf;

    end

    function callback2(h, e)

        % and also here
        set(my_handle, 'monkeys', 'maximum');

    end

end
于 2015-05-12T13:00:52.857 回答
1

正如 Rattus Ex Machina 所提到的,如果不查看其余代码,就很难调试。如果这有任何帮助,这里有一个简单的 GUI,它可以满足您的需求。花点时间尝试一下,看看是什么导致了代码中的错误。我怀疑这是一个基本问题,但我认为它出现在代码的其他地方,而不是你展示的部分。

function LoadMRIGUI
clc
clear all

handles.figure1  = figure('Position',[100 100 400 400],'Units','normalized');

P_axes = axes('Units','normalized','Position',[.2 .2 .6 .6]);

handles.ButtonStart= uicontrol('Style','push','String','Start','Position',[40 350 50 30],'Callback',@(s,e) btnStart_callback);
handles.ButtonStop= uicontrol('Style','push','String','Next','Position',[100 350 50 30],'Callback',@(s,e) btnNext_callback);

    %// === NEW === \\%
%// text box to see current index

handles.IdxTitle = uicontrol('Style','text','String','Index','Position',[160 350 50 20]);
handles.Idxbox = uicontrol('Style','text','String','1','Position',[220 350 50 20]);

    function btnStart_callback

        %// === NEW === \\%
        S = load('mri');
        d = S.D(:,:,1);

        handles.Img = imshow(d,'Parent' , P_axes);
        setappdata(handles.figure1 , 'Indx' , 1)
        setappdata(handles.figure1 , 'Data' , S.D)
    end


    function btnNext_callback
        indx = getappdata(handles.figure1 , 'Indx');
        D= getappdata(handles.figure1 , 'Data');
        d = D(:,:,indx+1);
        set(handles.Img , 'CData',d);
        setappdata(handles.figure1 , 'Indx' , indx+1);

        set(handles.Idxbox,'String',num2str(indx+1));
    end

end

示例截图:

在此处输入图像描述

希望有帮助!

于 2015-05-12T13:14:54.150 回答