如何手动将MatlabGuide GUI代码转换为Octave UI组件
我应该如何转换(手动)由MatlabGuide GUI创建的代码,以使用Octave的UI组件 像这样的东西:如何手动将MatlabGuide GUI代码转换为Octave UI组件,matlab,user-interface,octave,Matlab,User Interface,Octave,我应该如何转换(手动)由MatlabGuide GUI创建的代码,以使用Octave的UI组件 像这样的东西: gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @Mat_to_Octave_OpeningFcn, ...
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
等等等等
在大多数情况下,在倍频程上创建GUI与matlab完全相同。GUI创建是对octave的一个相对较新的添加,因此预计matlab家族中最近的几个添加尚未将其添加到octave中,但在大多数情况下,实现GUI应用程序的matlab代码应该可以在octave上工作,而无需或几乎不需要调整。以下是和的相应手动条目;您会注意到核心功能是相同的 一个重要的“陷阱”是octave暂时不支持嵌套函数的句柄(以后可能会更改)。例如,考虑下面的MATLAB代码实现一个简单的GUI,其中一个滑块影响情节(取自)。p> 如果您尝试在倍频程上运行此命令,将收到以下错误消息: >>myplot
错误:尚未支持嵌套函数的句柄
错误:从调用 第10行第11列的myplot 将嵌套函数转换为独立函数或子函数可以解决此问题(如中所示) 至于GUIDE,虽然octave还没有类似的用于创建GUI应用程序的“用户友好”图形工具,但归根结底,GUIDE所做的只是为UI元素创建生成适当的底层代码,理论上应该与octave兼容。话虽如此,值得仔细阅读一下files GUIDE创建的内容,即加载figure元素的“.fig”文件和包含回调和实际代码的“functions”文件等。因此,在倍频程中“运行”指南生成的文件可能需要先“加载”figure。此外,在实践中,GUIDE可能会使用嵌套函数进行回调,因此代码可能需要进行一些调整,才能将这些函数转换为合适的子函数,从而使其在倍频程上工作 话虽如此,GUIDE确实更适合那些喜欢避免使用“实际”代码的人,但事实上,一旦您熟悉了
get
/set
命令如何操作ui元素属性,那么直接在matlab/octave中编写GUI可能要简单得多。如果您正在寻找适用于octave和matlab的GUI解决方案,我当然会建议您沿着这条路线走下去,坚持使用子函数而不是嵌套函数
回答上述内容未涉及的其余两个问题:
- 不,指南不是开源的(更不用说自由软件了)。这是Mathworks使用其许可证的专有代码。特别是,在理论上,使用指南生成的八度代码可能会有许可问题,但我不确定
- GUIDE直接生成一个.fig文件。这是一个二进制文件,可以加载到matlab(理论上是倍频程)。使用指南,没有其他“源”文件详细说明用于创建此图形的uielements及其属性。如上所述,在matlab中,一旦加载图形,您可以从图形的图形菜单导出“源代码”,如果需要,可以重新创建此图形。但是,这可能不是最人性化的代码。这是喜欢编程方法而不是指南的原因之一:您有干净、清晰的源代码,它以编程方式详细说明uielements的属性,而不必通过加载图形并搜索其属性来查找它们
%%%%%% 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