gpt4 book ai didi

matlab - 为什么 guihandles 在这种情况下不起作用?

转载 作者:行者123 更新时间:2023-12-03 22:16:02 26 4
gpt4 key购买 nike

我正在开发一个大型 GUI,其基本结构非常基本,可以简单地简化为两个相互连接的控件(每个控件都更新另一个控件的值):一个 slider 和一个编辑框。他们分享的值(value)被用来制作情节。如果运行以下代码,您会发现只能更改一次值(通过移动幻灯片或编辑框)。第二次,它会抛出一个错误。主要问题是:为什么?应该如何使用 GUIHANDLES?

function GuiHandleShare1

handles.figure=figure;

handles.edit=uicontrol('Style','Edit',...
'Position',[5 5 50 20],...
'Callback',@edit_callback,...
'Tag','edit');
handles.slider=uicontrol('Style','Slider',...
'Position',[55 5 500 20],...
'Callback',@slider_callback,...
'Tag','slider');
handles.axes=axes('OuterPosition',[0.1 0.1 0.8 0.8],...
'Tag','axes');

function plotter
handles=guihandles;
plot(handles.axes,[0 1],[0 str2num(get(handles.edit,'String'))])

function edit_callback(h,eventdata)
handles=guihandles;
set(handles.slider,'Value',str2num(get(handles.edit,'String')));
plotter

function slider_callback(h,eventdata)
handles=guihandles;
set(handles.edit,'string',num2str(get(handles.slider,'Value')));
plotter

我试图通过挖掘guihandles的代码找到答案,但和guidata一样,它是getappdata、setappdata等的包装器,其源代码不可用(Matlab R2008b)。

我已经知道此类 GUI 的其他解决方案:1- 我没有使用 guihandles、guidata 或其他类似的东西,而是使用全局变量。2- 使用嵌套函数。

在我正在处理的情况下,嵌套函数不是一个选项,因为这会使主函数工作区成为静态工作区。这不是我想要的,因为我必须在应用程序中管理变量。我最终使用了全局变量:我在每个需要它们的函数中将句柄声明为全局变量并且它工作正常。这有什么缺点吗?我的意思是,如果我们可以使用全局变量,为什么 Matlab 会想出 guihandles、guidata 等命令?

最佳答案

您必须使用此属性/值对:

'NextPlot' ,'ReplaceChildren'

在最开始的轴定义中,否则 GUI 在第一个图之后创建一个新图形,并且与开始时的轴关联的标签不再有效。实际上如果你输入

get(handles.axes)

创建后,您会看到此属性设置为“replace”,它会替换整个轴而不是其子轴。因此代码看起来像这样:

handles.axes=axes('OuterPosition',[0.1 0.1 0.8 0.8],...
'Tag','axes','NextPlot' ,'ReplaceChildren');

作为全局变量的解决方法,您还可以使用 findobj 来检测轴,然后在其中绘制:

function plotter

hAx = findobj('Type','axes')
handles=guihandles;
plot([0 1],[0 str2num(get(handles.edit,'String'))],'parent',hAx);

但是如果你有多个轴就不太方便了。

据我所知,GUI 中的全局变量使代码更易于实现,但我知道的一个警告是,如果您计划从 GUI 部署独立应用程序,它会在编译期间抛出大量错误,并且您将不得不摆脱它们。

无论如何,使用上面的代码对我来说都很好。希望对您有所帮助!

关于matlab - 为什么 guihandles 在这种情况下不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26107142/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com