微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将 Argument 调用到其他函数 Octave GNU 中?

如何解决将 Argument 调用到其他函数 Octave GNU 中?

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

%%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,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

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

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

所以我想要做的是,我想将第一个函数(pushbutton_Callback)中定义的参数“fileName”带到第二个函数(popupX_callback)。但它不能在第二个函数中定义。 我听说八度音阶中的 nested function 可以用“foo”、“foobar”或“ex_top”、“ex_a”函数解析。但我无法解决“ex_”函数的问题。那么我是否必须使用“foo”、“foobar”函数将参数调用到其他函数中?

最好的问候!

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

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

%%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","Excel Datei mitbringen","callback",@pushbutton_Callback,[0.03 0.8 0.3 0.09]);


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

%% 1. Excel Data import
function pushbutton_Callback(hObject,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,handles)
fileName            = pushbutton_Callback(hObject,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,colNames);
endfunction

%% 3. Y Axis information from excel data import
function popupmenuY_Callback(hObject,handles)
filename            = pushbutton_Callback(hObject,handles)
handles.fileName    = fileName;
[numbers,colNames] = xlsread(fileName);
set(hObject,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 标题填充两个弹出菜单。

示例 data.csv 文件:

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

示例 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","CSV Dat Eye Meat Bringen","callback",{ @pushbutton_Callback,GuiWindow },[0.03 0.8 0.35 0.09],'button' );

% Popupmenus for selecting appropriate X and Y axis to display in plots
  uicontrol("Style","popupmenu","X Axis",{ @popupmenuX_Callback,"Position",[0.7 0.04 0.2 0.05],'XAxisMenu' );
  uicontrol("Style","Y Axis",{ @popupmenuY_Callback,[0.03 0.5 0.2 0.05],'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,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-','plotobject' );          
  endfunction

  %% 2. X Axis Information from excel data import
  function popupmenuX_Callback( hObject,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,'value' );
      YData     = [ getappdata( GuiWindow,'ydata',YData )
  endfunction

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

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

,

上面是 Tasos 的回答(带有 csv 文件),我将他的回答应用于我的代码,该代码适用于 excel 文件。因为代码 xlsread 忽略了列,所以用户应该关心这一点。

再次感谢 Tasos!

 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","Versuchsergebnis",'ForegroundColor','w','BackgroundColor',[0 0.4470 0.7410],'Fontweight','bold',"center",[0.03 0.9 0.35 0.08] );
                                    
% A button for importing (excel) data
  uicontrol ("style","Datei(xlsx) mitbringen",graphically selected by user
      fileName      = uigetfile('*.xlsx');
      [num,txt,raw] = xlsread(fileName);
      header        = raw(1,:);
      Data          = xlsread(fileName);
    % Show fileName
      button   = findobj('tag','button');
      set( button,fileName)
    % Populate the menu items for the X and Y Axis from the csv header
      XAxisMenu = findobj( 'tag',header );

      YAxisMenu = findobj( 'tag',header );

    % Also store headers and data as GuiWindow app data,'header',header );
      setappdata( GuiWindow,Data   );

    % Plot a preliminary plot in the plot area
      XData = Data(:,1);
      YData = Data(:,1);
      plot( XData,'Data' )( :,Selection ) ];
      PlotObj   = findobj( 'tag',YData )
  endfunction
,

线

fileName = fileName @pushbutton_Callback; 

没有按照你的想法去做。

解释背景有点复杂,但基本上在matlab中,使用classdef关键字创建的新型类,也允许继承,允许您调用“父”类(或“超类”)的方法通过 methodname@parentclassname(args) 语法。为了与 matlab 兼容,Octave 也将这个系统移植到了 Octave。您有效地得到的错误表明您正在尝试在没有意义的上下文中调用超类方法(这是真的,因为您不在 classdef 块内)。

这解释了为什么会出现该错误。

现在,就您尝试要做的事情而言,我认为您基本上只想从您的 pushbutton_Callback 函数中调用 popupmenuX_Callback 函数,对吗?因此,只需使用适当的参数就可以做到这一点,例如:

filename            = pushbutton_Callback(hObject,handles)
[numbers,colNames] = xlsread(fileName);

附注。我建议您始终在函数内缩进代码。它看起来更清晰,有助于捕捉错误!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。