Matlab HGimage的刷新CData中的问题

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' ,

最初,我在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' , 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
示例屏幕截图:

希望有帮助