将 Argument 调用到其他函数 Octave GNU 中? [英] Call Argument into other function Octave GNU?

查看:21
本文介绍了将 Argument 调用到其他函数 Octave GNU 中?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我将 Octave GNU 用于 GUI Excel 数据.我想问你们如何在另一个函数中调用定义的参数.这是我的代码.

I'm using Octave GNU for GUI Excel data. I want to ask you guys how can I call defined argument in another function. Here is my code.

%%First Function = pushbutton_Callback

function pushbutton_Callback(hObject, eventdata, handles)
fileName = uigetfile('*.xlsx')%%excel data import

handles.fileName=fileName;

guidata(hObject, handles)

endfunction

%%Second Function = popupmenuX_Callback

function popupmenuX_Callback(hObject, eventdata, handles)
fileName = fileName @pushbutton_Callback; 
printf ("in popupmenuX_Callback, calling pushbutton_Callback\n");

%%To nested function to prevent (because in Octave nested function is not accepted), I used subfunction as alternative%%

handles.fileName=fileName; %% This argument fileName I want to bring from first function
[numbers, colNames]=xlsread(fileName); %%read columns of excel data in first function
set(hObject,'string',colNames);
endfunction

如果我这样放置我的函数,总是会出现这些错误.

If I put my functions like this, always come these errors.

>> fileName = V8.xlsx
error: superclass calls can only occur in methods or constructors
error: called from
    popupmenuX_Callback at line 61 column 10

所以我想做的是,我想带定义的参数fileName"在第一个函数 (pushbutton_Callback) 到第二个函数 (popupX_callback) 中.但它不能在第二个函数中定义.我听说 Octave 中的 嵌套函数 可以用 " 解决;foo", foobar"或ex_top"、ex_a"功能.但是我无法解决ex_"函数的问题.那么我应该使用foo"、foobar"吗?函数将参数调用到其他函数中?

So what I want to do is, I want to bring defined Argument "fileName" in first function (pushbutton_Callback) to second function (popupX_callback). But it can not be defined in second function. I've heard that nested function in octave can be resolved with "foo", "foobar" or "ex_top", "ex_a" function. But I can't not resolve the problem with "ex_"function. Then should I have to use "foo", "foobar" function to call arguments into other function?

最好的问候!

============================================================================

===========================================================================

我用我的完整代码编辑了我的问题.(完整代码如下)所以我想做的是,就像这样视频.但是在 Matlab 中就像在视频中一样,它可以使用 GUIDE 或应用程序设计器制作,但在 Octave 中没有这样的功能.所以作为一个八度初学者,我很难解决这个问题.

I edited my questions with my full codes. (Full codes below) So what I want to do is, just like this video. But in Matlab like in video, it can be made with GUIDE or Application designer but in Octave there are no functions like that. So as a octave Beginner, it is hard for me to solve the problem.

%%Versuch
%% Diagramm zeichen
%%============================================================================
close all
clear h
graphics_toolkit qt
pkg load io
%%Uicontrols
%%Graph
h.ax = axes ("position", [0.3 0.25 0.6 0.5]);


%%Title
h.plot_title_label = uicontrol ("style", "text",
                                "units", "normalized",
                                "string", "Versuchsergebnis",
                                "horizontalalignment", "left",
                                "position", [0.03 0.9 0.25 0.08]);
                                  
%% Design for excel data import
    
h.print_pushbutton = uicontrol ("style", "pushbutton",
                                "units", "normalized",
                                "string", "Excel Datei mitbringen",
                                "callback", @pushbutton_Callback,
                                "position", [0.03 0.8 0.3 0.09]);


%% Drawing axis
h.popupmenuX        = uicontrol("Style","popupmenu",
    "units", "normalized",
    "string","X Axis",...
    "callback", @popupmenuX_Callback,
    "Position",[0.7 0.04 0.2 0.05]);
    
h.popupmenuY        = uicontrol("Style","popupmenu",
    "units", "normalized",
    "string","Y Axis",
    "callback",@popupmenuY_Callback,
    "Position",[0.03 0.5 0.2 0.05]);
%%=============================================================================                              
%% Functions
%%=============================================================================

%% 1. Excel Data import
function pushbutton_Callback(hObject, eventdata, handles)
fileName            = uigetfile('*.xlsx')%%excel data import
handles.fileName    = fileName;
guidata(hObject, handles)
endfunction

%% 2. X Axis Information from excel data import

function popupmenuX_Callback(hObject, eventdata, handles)
fileName            = pushbutton_Callback(hObject, eventdata, handles)
%%This code fileName causes error, that 'handles' is not defined.%%
handles.fileName    = fileName; %% This argument fileName I want to bring from first function
[numbers, colNames] = xlsread(fileName); %%read columns of excel data in first function
set(hObject,'string',colNames);
endfunction

%% 3. Y Axis Information from excel data import
function popupmenuY_Callback(hObject, eventdata, handles)
filename            = pushbutton_Callback(hObject, eventdata, handles)
handles.fileName    = fileName;
[numbers, colNames] = xlsread(fileName);
set(hObject,'string',colNames);
endfunction

%%%% Plot the graph
a                   = xlsread (fileName);
xColNum             = get(popupmenuX_Callback,'value');
yColNum             = get(popupmenuY_Callback,'value');
fileName            = handles.fileName;
x                   = a(:,xColNum);
y                   = a(:,yColNum);
h.ax                = plot(x,y);

推荐答案

GUI 示例,允许加载 .csv 文件,并根据 csv 标题填充两个弹出菜单.

Example of GUI which allows loading a .csv file, and populating two popupmenus based on the csv headers.

示例 data.csv 文件:

Example data.csv file:

Col1, Col2, Col3
1,    2,    3
2,    4,    8
3,    8,    9

示例 myscript.m

Example myscript.m

  pkg load io

% Create the Gui Window which will hold all controls and relevant data.
  GuiWindow = figure()

% An 'axes' object for displaying plots in the Gui Window
  axes ("position", [0.3 0.25 0.6 0.5], 'tag', 'plotarea' );

% Static text element used as a title
  uicontrol ("style", "text", "units", "normalized", "string", "Fur Zoo Hair Geb knees.", "horizontalalignment", "left", "position", [0.03 0.9 0.3 0.08] );
                                    
% A button for importing (excel) data
  uicontrol ("style", "pushbutton", "units", "normalized", "string", "CSV Dat Eye Meat Bringen", "callback", { @pushbutton_Callback, GuiWindow }, "position", [0.03 0.8 0.35 0.09], 'tag', 'button' );

% Popupmenus for selecting appropriate X and Y axis to display in plots
  uicontrol("Style","popupmenu", "units", "normalized", "string","X Axis", "callback", { @popupmenuX_Callback, GuiWindow }, "Position",[0.7 0.04 0.2 0.05], 'tag', 'XAxisMenu' );
  uicontrol("Style","popupmenu", "units", "normalized", "string","Y Axis", "callback", { @popupmenuY_Callback, GuiWindow }, "Position",[0.03 0.5 0.2 0.05], 'tag', 'YAxisMenu' );

  %%=============================================================================                              
  %% Functions (preferably placed in their own files!)
  %%=============================================================================

  function pushbutton_Callback(hObject, eventdata, GuiWindow)

    % Read in data from file, graphically selected by user
      fileName = uigetfile('*.csv');
      CellCsv  = csv2cell( fileName );
      Header   = CellCsv(1, :);
      Data     = CellCsv(2:end, :);

    % Populate the menu items for the X and Y Axis from the csv header
      XAxisMenu = findobj( 'tag', 'XAxisMenu' );
      set( XAxisMenu, 'string', Header );

      YAxisMenu = findobj( 'tag', 'YAxisMenu' );
      set( YAxisMenu, 'string', Header );

    % Also store headers and data as GuiWindow app data, in case we need them again later.
      setappdata( GuiWindow, 'Header', Header );
      setappdata( GuiWindow, 'Data'  , Data   );

    % Plot a preliminary plot in the plot area
      XData = [Data{:, 1}];
      YData = [Data{:, 1}];
      plot( XData, YData, 'bo-', 'tag', 'plotobject' );          
  endfunction

  %% 2. X Axis Information from excel data import
  function popupmenuX_Callback( hObject, eventdata, GuiWindow )
      Axes      = findobj( 'tag', 'plotarea' );
      Selection = get( hObject, 'value' );
      XData     = [ getappdata( GuiWindow, 'Data' ){ :, Selection } ];
      PlotObj   = findobj( 'tag', 'plotobject' );
      set( PlotObj, 'xdata', XData )
  endfunction

  %% 3. Y Axis Information from excel data import
  function popupmenuY_Callback( hObject, eventdata, GuiWindow )
      Axes      = findobj( 'tag', 'plotarea' );
      Selection = get( hObject, 'value' );
      YData     = [ getappdata( GuiWindow, 'Data' ){ :, Selection } ];
      PlotObj   = findobj( 'tag', 'plotobject' );
      set( PlotObj, 'ydata', YData )
  endfunction

这演示了在回调中访问其他图形对象的两种方法.一种是提供一个对象作为参数(例如 GuiWindow),另一种是提供可用于通过 findobj 函数识别对象的标签".

This demonstrates two methods of accessing other graphical objects within callbacks. One is providing an object as an argument (e.g., GuiWindow), and the other is providing 'tags' that can be used to identify objects via the findobj function.

请注意,我仅将数据存储在 GuiWindow 对象中,而不是每个单独的图形对象(如按钮等)中.另外,我更喜欢 setappdata,因为它允许以单独的名称存储多个数据(而 guidata 只存储单个对象,尽管它可以是一个结构体).

Note that I stored data in the GuiWindow object only, not to each individual graphical object (like buttons etc). Also, I preferred setappdata, because it allows to store multiple data under individual names (whereas guidata only stores a single object, although this can be a struct).

这篇关于将 Argument 调用到其他函数 Octave GNU 中?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆