【问题标题】:Using addlister in MATLAB GUI seems to "delete" existing handles在 MATLAB GUI 中使用 addlister 似乎会“删除”现有句柄
【发布时间】:2014-06-02 14:47:03
【问题描述】:

我对 MATLAB GUI 编程非常陌生(抱歉,使用 GUIDE)并且我遇到以下问题:GUI 在轴上显示存储在单元阵列中的图像序列。我有几个按钮和一个滑块来滚动序列。为了获得“连续滑块”,我使用了一个侦听器,这种方法可行但会产生一些问题:

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

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

关于为什么会发生这种情况的任何想法?这是我在滑块的 Create Function 中使用的代码:

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)

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

axes(hAxis)
imshow(Movie{frame},'parent',hAxis);

drawnow

% 这也不起作用,因为 Handles.edit_FrameNumber 不能被 Matlab 识别

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

guidata(hObject,handles);

欢迎任何提示谢谢!

【问题讨论】:

  • 好的,谢谢 Geoff,你是对的!此外,如果我使用外部函数连续显示当前帧(而不是在滑块回调中),它似乎可以工作。 “电影”单元格数组存储在一个结构中,其中包含我使用 setappdata/getappdata 在回调之间共享的所有全局变量;它阻止我在每个回调开始时将变量声明为“全局”。此外,如果它对阅读本文的人有任何帮助,那么当我使用侦听器时出现在 GUI 之外的数字是由于我之前调用了“gca”。

标签: matlab slider listener matlab-guide


【解决方案1】:

我想知道问题的一部分是否在于每次用户移动滑块时都会实例化一个侦听器,因为侦听器代码在此回调中,并且回调被提供给侦听器(似乎是某种奇怪的回溯-在那里来回走动)。因此,每次用户在幻灯片后释放鼠标按钮时,都会创建一个新的侦听器。这可能会导致其他按钮无法响应。

我不会在此处实例化侦听器,而是在您的 GUI 的 Opening_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(无论它从文件加载到哪个位置)。我想您还必须将滑块控件坐标映射到您拥有的帧数(尽管您可能已经这样做了?)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    相关资源
    最近更新 更多