在MatlabGUI中使用addlister似乎;删除“;现有手柄

在MatlabGUI中使用addlister似乎;删除“;现有手柄,matlab,slider,listener,matlab-guide,Matlab,Slider,Listener,Matlab Guide,我对MatlabGUI编程非常陌生(使用指南抱歉),我有以下问题:GUI在轴上显示存储在单元格数组中的图像序列。我有两个按钮和一个滑块来滚动序列。为了获得“连续滑块”,我使用了一个监听器,这种监听器可以工作,但会产生一些问题: 1) 当我按下滑块时,将创建一个图形,并在其中显示序列的第一帧,但当我移动滑块时,序列将显示在GUI的轴上(这是我想要的),图形将变为空。有谁能告诉我为什么会产生这个数字,我如何才能避免它 2) 一旦我按下滑块按钮并使用监听器,GUI中的所有句柄都不起作用,因为Matla

我对MatlabGUI编程非常陌生(使用指南抱歉),我有以下问题:GUI在轴上显示存储在单元格数组中的图像序列。我有两个按钮和一个滑块来滚动序列。为了获得“连续滑块”,我使用了一个监听器,这种监听器可以工作,但会产生一些问题:

1) 当我按下滑块时,将创建一个图形,并在其中显示序列的第一帧,但当我移动滑块时,序列将显示在GUI的轴上(这是我想要的),图形将变为空。有谁能告诉我为什么会产生这个数字,我如何才能避免它

2) 一旦我按下滑块按钮并使用监听器,GUI中的所有句柄都不起作用,因为Matlab无法识别它们,我只能使用功能滑块/显示器,但我不能使用按钮

你知道为什么会这样吗?以下是我在滑块的创建函数中使用的代码:

function slider2_Frame_Video_Callback(hObject, eventdata, handles)

hListener = addlistener(hObject,'ContinuousValueChange',@(a,b) slider2_Frame_Video_Callback(hObject, eventdata, handles)); % a and b are dummy arguments

guidata(hObject,handles)
在滑块回调中,代码如下所示(基本上在当前轴中显示):

drawnow

%这也不能用作句柄。Matlab无法识别编辑\u帧号

set(handles.edit_FrameNumber, 'String', frame);

guidata(hObject,handles);

欢迎任何提示,谢谢

我想知道问题的一部分是否在于每次用户移动滑块时侦听器都会被实例化,因为侦听器代码就在这个回调函数中,并且回调函数被提供给侦听器(看起来有点奇怪)。因此,每次用户在幻灯片后释放鼠标按钮时,都会创建一个新的侦听器。这可能会导致其他按钮没有响应时出现一些问题

我不会在那里实例化侦听器,而是在GUI的
打开\u Fcn
中执行此操作:

% --- Executes just before frameSlider is made visible.
function frameSlider_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to frameSlider (see VARARGIN)

% Choose default command line output for frameSlider
handles.output = hObject;

if ~isfield(handles,'hListener')
    handles.hListener = ...
        addlistener(handles.slider1,'ContinuousValueChange',@respondToContSlideCallback);
end

% Update handles structure
guidata(hObject, handles);
我的GUI名为
frameSlider
;你的将是另一种东西。上面创建了一个具有回调函数的侦听器,该函数需要在同一个*.m文件中定义,
respondToContSlideCallback

用于响应连续幻灯片的回调的示例正文如下

% --- Executes on slider movement.
function respondToContSlideCallback(hObject, eventdata)
% hObject    handle to slider1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB

% Hints: get(hObject,'Value') returns position of slider
%        get(hObject,'Min') and get(hObject,'Max') to determine range of slider

% first we need the handles structure which we can get from hObject
handles = guidata(hObject);

% test to display the current value along the slider
disp(['at slider coordinate ' num2str(get(hObject,'Value'))]);
如果运行此代码,则在从一端到另一端移动滑块时,命令窗口将连续显示滑块坐标


您上面的代码有一个
Movies
单元格数组。您的回调如何访问它?它是全局变量还是。。?
hist
来自哪里?如果
Movies
是其他函数调用的结果,那么它也可以保存到
handles
中(从文件加载到哪个位置)。我想您还必须将滑块控制坐标映射到您拥有的帧数(尽管可能您已经这样做了?)

好的,谢谢Geoff,您说得对!另外,如果我使用外部函数连续显示当前帧(而不是在滑块回调中),它似乎可以工作。“Movie”单元数组存储在一个包含所有全局变量的结构中,我使用setappdata/getappdata在回调之间共享这些全局变量;它阻止我在每次回调开始时将变量声明为“全局”。另外,如果它能对阅读本文的人有所帮助,那么当我使用侦听器时出现在GUI外部的图是因为我刚才调用了“gca”。
% --- Executes on slider movement.
function respondToContSlideCallback(hObject, eventdata)
% hObject    handle to slider1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB

% Hints: get(hObject,'Value') returns position of slider
%        get(hObject,'Min') and get(hObject,'Max') to determine range of slider

% first we need the handles structure which we can get from hObject
handles = guidata(hObject);

% test to display the current value along the slider
disp(['at slider coordinate ' num2str(get(hObject,'Value'))]);