HGimage刷新CData问题
Issue in Refresh CData of HGimage
最初我在 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);
错误是"Invalid or deleted object. "
为什么会出现这个错误,如何解决?
在不了解上下文的情况下,很难完全确定自己在做什么。重要的是,这些函数是在相同的还是不同的文件中定义的?似乎确实有一个明显的问题可能会导致您看到的错误:
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
.
我赞成的另一种方法是将这两个回调作为嵌套函数放置在代表您的 "application"(创建 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
示例屏幕截图:
希望对您有所帮助!
最初我在 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);
错误是"Invalid or deleted object. "
为什么会出现这个错误,如何解决?
在不了解上下文的情况下,很难完全确定自己在做什么。重要的是,这些函数是在相同的还是不同的文件中定义的?似乎确实有一个明显的问题可能会导致您看到的错误:
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
.
我赞成的另一种方法是将这两个回调作为嵌套函数放置在代表您的 "application"(创建 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
示例屏幕截图:
希望对您有所帮助!