Reference to non-existent field
显示 更早的评论
Hi folks,
Building my first GUI programmatically and hitting a snag early on.
Can anyone tell me why I am getting the error
Reference to non-existent field 'popbutt2'.
Error in maingui/updateAxes (line 83)
yColNum = get(hs.popbutt2, 'value');
Error in maingui/popbutt1 (line 93)
updateAxes(hObject, eventdata, hs)
Error while evaluating UIControl Callback
In the code below:
function maingui
hs = addcomponents;
hs.Fig.Visible = 'on';
%%Create tabbed GUI
function hs = addcomponents
hs.hFig = figure('Name', 'Main', ...
'Position', ...
[20 100 1870 850]);
s = warning('off', 'MATLAB:uitabgroup:OldVersion');
%%Build Tabs
hs.TabGroup = uitabgroup('Parent',hs.hFig, 'Position', [ .01 .01 .98 .975 ]);
warning(s);
hs.Tabs(1) = uitab('Parent',hs.TabGroup, 'Title',' Preprocessing ');
hs.Tabs(2) = uitab('Parent',hs.TabGroup, 'Title',' Data ');
hs.Tabs(3) = uitab('Parent',hs.TabGroup, 'Title',' Report ');
set(hs.TabGroup, 'SelectedTab',hs.Tabs(1));
hs.TextBox = uicontrol('style','text', 'Position', [ 800 820 250 30] );
set(hs.TextBox,'String',' Main Processing Interface', ...
'Units', 'Characters', 'FontSize', 14, 'ForegroundColor', [ 0 0 0]);
%%Create Tab 1 Panels
%# populate tabs with UI components
hs.DataPanel1 = uipanel('Parent', hs.Tabs(1), 'Position', [.01 .01 .98 .98], 'BackgroundColor', 'white');
hs.DataPanel2 = uipanel('Parent', hs.DataPanel1, 'Position', [ .01 .9 .4 .08]);
%DataPanel3 = uipanel('Parent', DataPanel2, 'Position', [ .3 .3 .55 .6], 'BackgroundColor', 'white');
hs.textload = uicontrol('Style','text', 'String','No File Currently Loaded', ...
'Parent',hs.DataPanel2, 'Position', [ 130 15 450 30], 'FontSize', 12);
set(hs.textload,'callback', {@loadbutt1, hs});
% Plot 1
hs.ax1 = axes('Parent', hs.DataPanel1, 'units', 'normalized', 'Position', [.1 .5 .3 .3], 'box', 'on');
% X Axis Popup for Plot 1
hs.popbutt1 = uicontrol('Style','popupmenu', 'String','*', ...
'Parent',hs.Tabs(1), 'Position', [40 500 100 100]);
set(hs.popbutt1,'callback',{@popbutt1,hs});
% Y Axis Popup for Plot 1
hs.popbutt2 = uicontrol('Style','popupmenu', 'String','*', ...
'Parent',hs.Tabs(1), 'Position', [40 400 100 100]);
set(hs.popbutt2,'callback',{@popbutt2,hs});
% Load Data Button
hs.loadbutt1 = uicontrol('Style','pushbutton', 'String','Load Data', ...
'Parent',hs.DataPanel2, 'Position', [ 10 18 100 30]);
set(hs.loadbutt1,'callback',{@loadbutt1,hs});
% Filename
end
% Executes on button press in loadbutt1
function hs = loadbutt1(hObject, eventdata, hs)
hs.fileName = uigetfile('*.*');
guidata(hObject, hs);
set(hs.textload,'string',hs.fileName);
setpopmenuString(hs.popbutt1, eventdata, hs);
setpopmenuString(hs.popbutt2, eventdata, hs);
guidata(hObject, hs);
[numbers, colNames] = xlsread(hs.fileName);
hs.numbers = numbers
updateAxes(hObject, eventdata, hs);
guidata(hObject, hs);
end
% Set Figure 1 Axis as per XLS Row 34
function hs = setpopmenuString(hObject, eventdata, hs)
guidata(hObject, hs);
fileName = hs.fileName;
[numbers, colNames] = xlsread(hs.fileName);
hs.numbers = numbers
colNames2 = colNames(34,:)';
set(hObject,'string', colNames2);
guidata(hObject, hs);
end
% XLSRead to Populate Popupmenu Columns
function [x,y]= readExcelColumns(fileName, xColNum, yColNum)
a = xlsread(fileName);
x = a(:,xColNum);
y = a(:,yColNum);
end
% Plotting Function for Ax1
function hs = updateAxes(hObject, eventdata, hs)
guidata(hObject, hs);
xColNum = get(hs.popbutt1, 'value');
yColNum = get(hs.popbutt2, 'value');
x = hs.numbers(:,xColNum);
y = hs.numbers(:,yColNum);
fileName = hs.fileName;
[x,y]= readExcelColumns(fileName, xColNum, yColNum);
plot(hs.ax1, x,y)
end
function hs = popbutt1(hObject, eventdata, hs)
updateAxes(hObject, eventdata, hs)
end
function hs = popbutt2(hObject, eventdata, hs)
updateAxes(hObject, eventdata, hs)
end
end
Apologies if I am missing some protocol here, would appreciate any clues or tips at all.
I have used the Debugger and when I pause on
function hs = updateAxes(hObject, eventdata, hs)
guidata(hObject, hs);
xColNum = get(hs.popbutt1, 'value');
the last line, I can see the 'hs' structure doesn't include popbutt2, I'm just not sure why...
Matt
采纳的回答
更多回答(2 个)
Image Analyst
2015-12-20
0 个投票
Ah, the difficulties of rolling your own. You will encounter lots of things like this if you continue. To fix this one, evidently you're calling updateAxes() before the popbutt2 button gets created. But the problem is that updateAxes() references hs.popbutt2, which doesn't exist yet. Step through with the debugger to find out when updateAxes() gets called first, and make sure that you've created popbutt2 before that.
Why not just use GUIDE or a ready-made framework to get a fast start like this one: http://www.mathworks.com/matlabcentral/fileexchange/24224
类别
在 帮助中心 和 File Exchange 中查找有关 Loops and Conditional Statements 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!