matlab:gui和全局变量

时间:2012-11-05 04:08:57

标签: matlab user-interface global-variables handles

我在GUI中的Callback中有几个函数(在单独的文件中定义),如下所示:

function myFunction_Callback(hObject, eventdata, handles)
[output] = function1(input);
[output] = function2(input);
[output] = function3(input);
guidata(hObject, handles);

现在,假设我正在定义function1,我想在句柄中存储一个局部变量。我喜欢的时候:

[output] = function1(input)
localVariable = [1 2 3];
handles.myVariable = localVariable;
一旦function1完成,

handles.myVariable'会从句柄中消失'。如何让它“留在”手柄?我是否必须将其定义为输出,然后存储在这样的句柄中:

[output, localVariable] = function1(input)
...
localVariable = [1 2 3];

以后

function myFunction_Callback(hObject, eventdata, handles)
[output, handles.myVariable] = function1(input);
[output] = function2(input);
[output] = function3(input);
guidata(hObject, handles);

?? 我知道这个问题听起来非常愚蠢,可能不清楚,但请原谅我,我对GUI很困惑并处理新手:) 谢谢!

2 个答案:

答案 0 :(得分:1)

是的,你的一般方法是可以的,虽然有一些事情:

  • handles通常是指包含对象句柄的数据结构。向其中添加其他类型的数据是有效的,但不可取,因为它只是令人困惑。

  • 不需要功能单个输出的括号。当然,这是一个品味和编码风格的问题,但这是我建议反对的;仅使用括号对属于一起的东西进行分组。

  • 您的input在某处包含handles吗?同样,函数output是否包含handles的修改版本?如果没有函数修改handles,那么每次调用回调时都不需要重新保存它......

总而言之,做到这样的事情:

function myFunction_Callback(hObject, eventdata, handles)
    ...
    output = func1(input);  
    output = func2(output);  
    output = func3(output);
    ...
    guidata(hObject, output);  % <-- NOTE: output contains handles


function output = func1(input)
    ...
    output.handles = input.handles;
    ...
    output.localVar = [1 2 3];
    ...

答案 1 :(得分:1)

围绕这些功能传递数据可能会非常痛苦。

我发现为这些原因应用面向对象编程非常有帮助。特别是将您的班级定义为classdef myclass < handles。使用这些可以轻松完成各种各样的酷事 - 例如在不相关的数字之间传输数据。

实施singleton pattern而不是全局是有帮助的。我还给出了here的答案observer pattern