2016-03-07 3 views
0

Я не уверен, правильно ли я это сделаю, но хочу иметь функцию, которая при вызове существенно сбрасывает 4 графика. Я храню графики как handles.distplot1, handles.distplot2 и т. Д. В надежде на то, что вы выбрали, какой график показан на оси. Мне нужно будет сбросить эти графики после нескольких разных событий, поэтому, естественно, я хочу бросить их в функции и избежать избыточности кода. Я надеюсь, что такая функция, какMatlab GUI - Устранение неполадок с помощью функции обновления

function setupDistPlots(hObject, eventdata, handles) 
    % filler data for surfc 
    x = [1 2]; 
    z = zeros(2); 
    % setup blank plots for funtion to work with 
    a = figure(1); set(a, 'Visible', 'off') 
    handles.distplot1 = surfc(x, x, z); 
    b = figure(2); set(b, 'Visible', 'off'); 
    handles.distplot2 = bar(NaN); 
    c = figure(3); set(c, 'Visible', 'off') 
    handles.distplot3 = surfc(x, x, z); 
    d = figure(4); set(d, 'Visible', 'off') 
    handles.distplot4 = bar(NaN); 
    guidata(hObject, handles); 

0 Кое-что, я считаю, должно работать должным образом, но я понятия не имею, как это назвать. В функции открытия я пытаюсь setupDistPlots(hObject, eventdata, handles) но получить следующее сообщение об ошибке при попытке получить доступ к handles.distplot1 позже:

Reference to non-existent field 'distplot1'. 

Error in tabbedGUI>distanceToggle_Callback (line 212) 
       distribution(hObject, 
       handles.distplot1, ... 

Error in gui_mainfcn (line 95) 
     feval(varargin{:}); 

Error in tabbedGUI (line 45) 
    gui_mainfcn(gui_State, varargin{:}); 

Error in 
@(hObject,eventdata)tabbedGUI('distanceToggle_Callback',hObject,eventdata,guidata(hObject)) 


Error while evaluating UIControl Callback 

редактирования: Также, пожалуйста, указать на все, что я мог бы улучшить. Все, что я делаю в Matlab, кажется хакером, как будто должно быть лучше.

edit2: Проблема с функцией открытия вызывала setupDistPlots перед вызовом функции открытия функции guidata(hObject, handles). Однако теперь, когда когда я звоню `setupDistPlots снова на нажатие кнопки, я получаю следующее сообщение об ошибке:

Error using matlab.graphics.primitive.Data/set 
Invalid or deleted object. 

Error in andrewDistribution (line 45) 
    set(hplot1, 'xData', x1, 'yData', y1, 'zData', zeros(length(x1))) 

Error in tabbedGUI>distanceToggle_Callback (line 200) 
       distribution(hObject, handles.distplot1, ... 

Error in gui_mainfcn (line 95) 
     feval(varargin{:}); 

Error in tabbedGUI (line 45) 
    gui_mainfcn(gui_State, varargin{:}); 

Error in @(hObject,eventdata)tabbedGUI('distanceToggle_Callback',hObject,eventdata,guidata(hObject)) 


Error while evaluating UIControl Callback 
+0

Вы инициирующего, что обратный вызов, нажав на что-то или MATLAB пытается вызов этого обратного вызова при загрузке графического интерфейса? – Suever

+0

Где в функции открытия вы разместили эту строку? Если перед существующими 'guidata (hObject, handles),' line, то ваши изменения будут перезаписаны дескрипторами GUIDE по умолчанию. Кроме того, это 'handles', а не' handle'. – excaza

+0

Ошибка при нажатии кнопки, и обратный вызов пытается получить доступ к 'handleles.distplot1'. 'setupDistPlots' запускается в функции открытия, но, похоже, не обновляет дескрипторы.Ошибка не до тех пор, пока я не нажму на определенную кнопку – Shatnerz

ответ

1

Я предполагаю, что ваши первоначальные попытки выглядели так:

% --- Executes just before testgui is made visible. 
function testgui_OpeningFcn(hObject, eventdata, handles, varargin) 
% Choose default command line output for testgui 
handles.output = hObject; 

setupDistPlots(hObject, eventdata, handles) 

% Update handles structure 
guidata(hObject, handles); 

Как говорил с в комментарии, ваши изменения в структуре handles, сохраненные в графическом интерфейсе, на setupDistPlots с использованием guidata, заменяются последующим вызовом guidata GUIDE. Короткий ответ - поставить setupDistPlotsпослеguidata, чтобы все функционировало как написано.


Теперь более длинный ответ. Я собираюсь предположить, что вы знакомы в основном с MATLAB scripts rather than MATLAB functions. Если сценарии разделяют базовое рабочее пространство, functions each have their own separate workspace in memory. Как написано, нет никакого способа для вашего OpeningFcn знать, что вы изменили структуру handles, поэтому он с радостью перезаписывает ваши изменения, используя значение handles, которое было передано setupDistPlots. Чтобы обойти это, вам нужно указать способ для OpeningFcn, чтобы знать, что вы внесли изменения.

Один подход заключается в specify an output для setupDistPlots:

function handles = setupDistPlots(hObject, eventdata, handles) 
    % filler data for surfc 
    x = [1 2]; 
    z = zeros(2); 
    % setup blank plots for funtion to work with 
    a = figure(1); set(a, 'Visible', 'off') 
    handles.distplot1 = surfc(x, x, z); 
    b = figure(2); set(b, 'Visible', 'off'); 
    handles.distplot2 = bar(NaN); 
    c = figure(3); set(c, 'Visible', 'off') 
    handles.distplot3 = surfc(x, x, z); 
    d = figure(4); set(d, 'Visible', 'off') 
    handles.distplot4 = bar(NaN); 

Размещение setupDistPlots до guidata вызова в коде GUIDE:

% --- Executes just before testgui is made visible. 
function testgui_OpeningFcn(hObject, eventdata, handles, varargin) 
% Choose default command line output for testgui 
handles.output = hObject; 

handles = setupDistPlots(hObject, eventdata, handles); 

% Update handles structure 
guidata(hObject, handles); 
+0

Спасибо. Я больше привык к работе с функцией. Я новичок в Matlab и понятия не имею, как работает «guidata». Я предположил, что он обновил глобальный или что-то в этом роде, но то, что вы сказали, имеет прекрасный смысл. Я постоянно забываю, что 'handles' передается как аргумент. Я чувствую себя идиотом. Я также редактировал свой вопрос. Я посмотрю, помогут ли эти предложения. – Shatnerz

Смежные вопросы