现在,我正在开发一个基于用户输入数据绘制图形的GUI。用户使用编辑框输入数字,然后从中生成绘图。
我有两个值,周期和频率,在数学上我知道是相互依赖的(p = 1 / f,反之亦然)。我相信我已经做到这一点,当我编辑频率时,计算一个新的周期值,但我还想做的是每当用户键入一个新的频率值时,在句点编辑框中显示句点的新值。为了说明,这里是我现在为频率编辑框提供的代码:
%period (ns)
function edit11_Callback(hObject, eventdata, handles)
num = str2double(get(hObject,'string'));
%global edit10;%brings frequency to edit11 function
%global edit11;%globalize period
handles.edit11 = num;
handles.edit10 = 1/num;%frequency = 1/period
set(handles.edit10,'String',num2str(1/num));%displays new frequency
guidata(hObject,handles)
注意:edit10是句点的编辑框。我希望那个代码只是与我对频率的反转。此外,我评论了“全球”线,因为我似乎并不需要它来做我想做的事情,但我确实试过了。
“handles.edit10 = 1 / num;”更新期间的实际值。据我所知,最后一行(guidata(...))将全局保存handle.edit10和handles.edit11的新值,但请纠正我,如果这是错误的,请。
什么行不通的行:“set(handles.edit10,'String',num2str(1 / num));”,它应该在句点编辑框中显示句点的新值(edit10 )。
我得到的错误信息如下:
Error using handle.handle/set
Invalid or deleted object.
Error in Liposome_GUI>edit11_Callback (line 367)
set(handles.edit10,'String',num2str(1/num));%displays new frequency
Error in gui_mainfcn (line 95)
feval(varargin{:});
Error in Liposome_GUI (line 42)
gui_mainfcn(gui_State, varargin{:});
Error in @(hObject,eventdata)Liposome_GUI('edit11_Callback',hObject,eventdata,guidata(hObject))
Error while evaluating uicontrol Callback
错误消息使得函数edit11似乎无法访问存储在handles.edit10中的值,但如果我将这两个“全局”行放在edit10和edit11函数下,似乎没有任何改变。
有谁能告诉我我做错了什么?
答案 0 :(得分:0)
如果删除了edit10句柄的覆盖,会发生什么? 你也不需要覆盖edit11,也不需要保存句柄
当edit11
上有回调时,以下内容将起作用%period (ns)
function edit11_Callback(hObject, eventdata, handles)
num = str2double(get(handles.edit11,'string'));
set(handles.edit10,'String',num2str(1/num)); %displays new frequency
end
答案 1 :(得分:0)
我认为错误是因为您在第7行的edit10
中使用此命令覆盖分配给uicontrol edit11_Callback
的值:
handles.edit10 = 1/num;%frequency = 1/period
然后MATLAB认为实际的编辑框句柄已被删除,因为与之关联的每个数据都被变量num
覆盖。
否则您的代码应该有效。我做了一个简单的GUI,以防你想玩编辑框。它的作用是简单地更新编辑框和取决于周期/频率的虚拟数据图。一切都被评论,所以应该很容易遵循。如果有不清楚的地方请告诉我。
function GUI_EditBox
clc
clear
close all
%// Create GUI components
hFigure = figure('Position',[100 100 500 500],'Units','Pixels');
handles.axes1 = axes('Units','Pixels','Position',[60,90,400,300]);
handles.TextPeriod = uicontrol('Style','Text','Position',[20 470 60 20],'String','Period');
handles.TestFrequ = uicontrol('Style','Text','Position',[20 440 60 20],'String','Frequency');
handles.EditPeriod = uicontrol('Style','Edit','Position',[100 470 60 20],'String','2*pi','Value',1,'Callback',@(s,e) EditPeriodCallback);
handles.EditFrequ = uicontrol('Style','Edit','Position',[100 440 60 20],'String','pi/2','Callback',@(s,e) EditFrequCallback);
%// Define initial period and frequency
handles.Period = 2*pi;
handles.Frequency = 1/handles.Period;
%// Define x data and function to plot
handles.x = 0:pi/10:2*pi;
handles.y = rand(1)*sin(handles.Period.*handles.x);
plot(handles.x,handles.y,'Parent',handles.axes1)
guidata(hFigure,handles); %// Save handles structure of GUI.
%// The callbacks for both edit boxes are quite similar. Basically get the value entered by the user and update the other as well as the plot.
function EditPeriodCallback(~,~)
handles = guidata(hFigure);
handles.Period = str2double(get(handles.EditPeriod,'String'));
handles.Frequency = 1/handles.Period;
set(handles.EditFrequ,'String',num2str(1/handles.Period));
handles.y = 2*rand(1)*sin(handles.Period.*handles.x);
plot(handles.x,handles.y,'Parent',handles.axes1)
guidata(hFigure,handles);
end
function EditFrequCallback(~,~)
handles = guidata(hFigure);
handles.Frequency = str2double(get(handles.EditFrequ,'String'));
handles.Period = 1/handles.Frequency;
set(handles.EditPeriod,'String',num2str(1/handles.Frequency));
handles.y = 2*rand(1)*sin(handles.Period.*handles.x);
plot(handles.x,handles.y,'Parent',handles.axes1)
guidata(hFigure,handles);
end
end
GUI的示例屏幕截图:
请注意,添加一个用户可以提供多个pi或类似内容而不是整数的框可能会很有用。
希望有所帮助!