如何手动将Matlab GUIDE GUI代码转换为Octave UI组件

How to manually convert Matlab GUIDE GUI code to Octave UI Components

我应该如何将 Matlab GUIDE GUI 创建的(手动)代码转换为使用 Octave 的 UI 组件?

像这样的东西:

gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
               'gui_Singleton',  gui_Singleton, ...
               'gui_OpeningFcn', @Mat_to_Octave_OpeningFcn, ...
               'gui_OutputFcn',  @Mat_to_Octave_OutputFcn, ...
               'gui_LayoutFcn',  [] , ...
               'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

等等等

  1. 在哪里可以找到我需要替换的元素的完整列表?

  2. 如何为 Octave UI elements 创建与 GUIDE 回调函数等效的函数,我能否为所有元素创建一个回调函数?也许两者之间存在差异。

  3. GUID GUI代码是开源的,还是开源的?它surely seems so here

  4. 用户在GUIDE中设置的UI布局是否可以访问?即我们知道按钮的宽度和文本颜色设置保存在哪里吗?

  5. 哪里有完整的列表?如果有,在哪里? GUIDE 中的全部或至少大部分元素是否在 UI 组件中可用?我怎样才能检查这个?

  6. 在开始任务之前我有什么遗漏的吗?

在大多数情况下,在 Octave 上创建 GUI 与 matlab 相同。 GUI-creation 是对八度音阶的一个相对较新的添加,因此预计 matlab 系列中最近添加的几个还没有进入八度音阶,但在大多数情况下,matlab 代码实现了 GUI 应用程序应该在八度音阶上工作,不需要或很少需要调整。以下是 matlab and octave 的相应手动条目;您会注意到核心功能是相同的。

一个重要的'catch'是octave暂时不支持嵌套函数的句柄(稍后可能会改变)。例如,考虑以下实现简单 GUI 的 matlab 代码,其中带有影响绘图的滑块(取自 this answer)。

%%%%%% In file myplot.m %%%%%
function myplot

  %% Create initial figure and spiral plot
  figure;  axes ('position', [0.1, 0.3, 0.8, 0.6]);
  t = linspace (0, 8*pi, 100);  x = t .* cos(t);  y = t .* sin(t);
  plot (x, y);  axis ([-100, 100, -100, 100]);

  %% Add ui 'slider' element      
  hslider = uicontrol (                    ...
         'style', 'slider',                ...
         'Units', 'normalized',            ...
         'position', [0.1, 0.1, 0.8, 0.1], ...
         'min', 1,                         ...
         'max', 50,                        ...
         'value', 10,                      ...
         'callback', {@plotstuff}          ...
       );

  %% Callback function called by slider event
  function plotstuff (h, event)
    n = get (h, 'value');
    x = n * t .* cos(t);  y = n * t .* sin(t);
    plot (x, y);  axis ([-100, 100, -100, 100]);
  end
end

如果你在八度上尝试 运行 这个,你会收到以下错误信息:

>> myplot
error: handles to nested functions are not yet supported
error: called from myplot at line 10 column 11

将嵌套函数转换为独立函数或子函数可以解决此问题(如 中所示)。

至于 GUIDE,虽然 Octave 还没有类似的 "user-friendly" 用于 GUI-app 创建的图形工具,但归根结底,所有 G UIDE 所做的是为 UI-元素创建生成适当的基础代码,理论上应该与八度兼容。话虽如此,值得仔细阅读 GUIDE 创建的文件,即加载图形元素的“.fig”文件,以及包含回调和实际代码的 'functions' 文件等。所以, "running"一个GUIDE生成的八度文件大概会先涉及到'loading'这个数字。此外,在实践中,GUIDE 可能会使用嵌套函数进行回调,因此代码可能需要进行一些调整才能将它们转换为 suitable 子函数以使其在八度音阶上工作。

话虽如此,GUIDE确实更适合喜欢避免'actual'代码的人,但实际上,直接在matlab / octave中编码GUI是一旦您熟悉了 get / set 命令如何处理 ui 元素属性,可能会更直接。如果您正在寻找适用于 Octave 和 Matlab 的 GUI 解决方案,我当然会建议您沿着这条路走下去,并坚持使用子函数而不是嵌套函数。

回答上面没有涉及的其余两个问题:

  • 不,GUIDE 不是开源的(更不用说自由软件了)。它是 Mathworks 的专有代码,使用了他们的许可证。特别是,理论上,使用 GUIDE 生成的八度代码可能存在许可问题,但我不确定。

  • GUIDE直接生成.fig文件。这是一个二进制文件,可以加载到 matlab(理论上是 Octave)上。对于 GUIDE,没有其他 'source' 文件详细说明用于创建此图形的 ui 元素及其属性。话虽如此,在 matlab 中,加载图形后,您可以从图形的图形菜单中导出 'source code',如果需要,可以重新创建该图形。但是,这可能不是最人性化的代码。这是比 GUIDE 更喜欢编程方法的原因之一:你有干净、清晰的源代码,它以编程方式详细说明了 ui 元素的属性,而不是必须通过加载图形并搜索其属性。