HGimage的刷新CData中的问题

时间:2015-05-12 12:51:21

标签: matlab imshow

最初我在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);

中找到了一个

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

为什么会出现此错误以及如何解决?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

正如Rattus Ex Machina所提到的,如果没有看到其余的代码,很难调试。如果这可能有任何帮助,这里有一个简单的GUI,它可以完成您的工作。花点时间玩它来查看可能导致代码错误的原因。我怀疑这是一个基本问题,但我认为它来自代码中的其他地方而不是你所展示的部分。

AuthorInlineFormSet = inlineformset_factory(Author, Book, fields=['name'], widgets={
    'name': Textarea(attrs={'cols': 80, 'rows': 20})
})

示例截图:

enter image description here

希望有所帮助!