Matlab HGimage的刷新CData中的问题
最初,我在GUI中创建一个图形,带有两个按钮(btnStart、btnNext)和一个轴(p_轴)。对于以上两个按钮,我使用回调函数 在第一个按钮回调函数Matlab HGimage的刷新CData中的问题,matlab,imshow,Matlab,Imshow,最初,我在GUI中创建一个图形,带有两个按钮(btnStart、btnNext)和一个轴(p_轴)。对于以上两个按钮,我使用回调函数 在第一个按钮回调函数 function btnStart_callback(hObject,eventdata ,handles) load MRI; d = D(:,:,1); handles.Img = imshow(d,'Parent' , P_axes); setappdata(handles.figure1 , 'Indx' ,
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
在第二个按钮回调函数中
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
在第二个回调函数中,我在集合(handles.Img,'CData',d)行中得到了一个回调函数代码>
错误为“无效或已删除对象”。
发生此错误的原因及解决方法 如果不了解背景,很难绝对确定自己在做什么。重要的是,这些函数是在相同的文件中定义的,还是在不同的文件中定义的?似乎确实存在一个明显的问题,可能会导致您看到的错误:
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
在上面的例子中,句柄
被传入、修改,然后在函数结束时被丢弃。如果函数在不同的文件中定义,则存储在.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
正如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
示例屏幕截图:
希望有帮助