最初我在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);
错误是"无效或已删除的对象。 "
为什么会出现此错误以及如何解决?
答案 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})
})
示例截图:
希望有所帮助!