更新MatlabGUI的所有组件(使用指南创建)

更新MatlabGUI的所有组件(使用指南创建),matlab,user-interface,matlab-guide,Matlab,User Interface,Matlab Guide,我的MatlabGUI是一个表单,其中包含许多文本字段,这些字段最初使用相同的数据结构填充。每个文本字段都有一个回调函数和一个create函数,其中文本字段被赋予给定结构的值。但是,在稍后的某个时候,我想使用不同的结构重新填充表单,作为按下按钮触发的事件。代码大致如下所示: h = MyFigure; global mystruct mystruct = somevalues; handles = guidata(h); set( handles.textfield1, 'String',

我的MatlabGUI是一个表单,其中包含许多文本字段,这些字段最初使用相同的数据结构填充。每个文本字段都有一个回调函数和一个create函数,其中文本字段被赋予给定结构的值。但是,在稍后的某个时候,我想使用不同的结构重新填充表单,作为按下按钮触发的事件。代码大致如下所示:

h = MyFigure;
global mystruct

mystruct = somevalues;

handles = guidata(h);

set( handles.textfield1, 'String', mystruct.value1 )
...
set( handles.textfieldN, 'String', mystruct.valueN )
然而,如果我能让Matlab递归地调用所有这些回调函数(如“validate tree”函数),我就不必为每个文本字段调用“set”。我尝试过刷新(h)和drawnow(),但没有成功


现在我的问题是matlab guide框架中是否内置了这样一个函数?

您需要使用以下内容更新句柄结构:

% Update handles structure
guidata(hObject, handles);

设置
句柄的属性(如
set(h,'String',str)
)时,将复制
str
的值。它不是对可以自动更新的变量的引用。最好的方法是创建一个名为
updateText
或类似的子例程,将所有
set
语句放入其中,并在需要时调用它

调用
guidata(hObject,handles)仅用于在修改
句柄后更新GUI。您可能在其他地方需要它,但对于更新某些句柄图形对象的属性的工作,它并没有真正被使用


一种可能的方法是创建一个数据库,定期更新文本字段。在GUI的打开函数中,创建一个计时器,定义要定期运行的更新函数:

T = timer('Period',1,'StartDelay',0.5,'TimerFcn', ...
          {@updateTextBoxes,handles},'ExecutionMode','FixedRate');
start(T)
更新函数的外观如下所示:

function updateTextBoxes(hTimerObj, timerEvent, handles)
global mystruct
% get mystruct data however you do it...
% maybe also get handles via handles=guidata(hTimerObj); instead of input
set( handles.textfield1, 'String', mystruct.value1 )
...
set( handles.textfieldN, 'String', mystruct.valueN )

编辑:在退出GUI之前,不要忘记删除计时器(
delete(T)
)或停止它,或者执行
清除T
,否则它将继续运行,您将不得不退出MATLAB。。。不,这不是我自己干的

我也尝试过,但似乎没有效果,而只使用“set”似乎有效。也许我指的是错误的手柄?我的第一个猜测是句柄hObject应该与代码中的h相同,即表单的句柄。但是,代码中的跟踪表明在调用guidata(h,handles)时不会调用与每个textfield关联的回调。也许当时我不太明白。您的文本字段将被字符串填充并显示。但你只是想得到一些递归的东西来填充它们?我不确定能不能赶上。谢谢!这基本上回答了我的问题……似乎textfield回调只在用户输入时调用,或者还有其他情况吗?@user1186155触发回调的规则对于每种对象类型都不同,但是是的,回调不只是自动运行。但是,您可以创建一个
计时器
,它将在特定的时间间隔内定期更新回调。我根据这些思路更新了答案。