【问题标题】:Load data by one button, plot data by a second button通过一个按钮加载数据,通过第二个按钮绘制数据
【发布时间】:2017-08-04 01:23:24
【问题描述】:

我在 Matlab 中有一个 GUI,和几个按钮,通过一个按钮我需要加载一个文件(我不希望显示目录)并通过第二个按钮绘制确定的数据。

第一个按钮的代码:

[filename, pathname] = uigetfile({'*.xlsx;*.xls'}); 

第二个按钮的代码:

fileID = fopen(strcat(pathname, filename), 'r'); 


handles.fileData = xlsread(strcat(pathname, filename));


axes(handles.axes1);
plot(handles.fileData(:,1),'-k')
hold on;
axes(handles.axes1)
plot(handles.fileData(:,2),'k')

我总是收到一条错误消息:

未定义的函数或变量“路径名”。

如何将函数传递给第二个按钮?

提前感谢您的帮助!

【问题讨论】:

  • 打印pathname,它说什么?
  • 在每个函数的开头将路径名定义为全局

标签: excel matlab user-interface plot


【解决方案1】:

临时解决方案正在使用:setappdatagetappdata

例子:

function pushbutton1_Callback(hObject, eventdata, handles)
setappdata(0, 'pathname', 'abc');

function pushbutton2_Callback(hObject, eventdata, handles)
pathname = getappdata(0, 'pathname'); % Return 'abc'.

另一个简单的解决方案是在父图形的UserData 成员中传递pathname
当两个按钮在同一个图中时,hObject.Parent 是图中的handleUserData 元素是在 GUI 对象之间传递数据的“准备”。

例子:

function pushbutton1_Callback(hObject, eventdata, handles)
hObject.Parent.UserData.pathname = 'abs';

function pushbutton2_Callback(hObject, eventdata, handles)
pathname = hObject.Parent.UserData.pathname; %Value is 'abc'

更多信息请参考:https://www.mathworks.com/help/matlab/creating_guis/share-data-among-callbacks.html


不使用guide工具的完整代码示例:
我在没有使用guide 工具的情况下创建了以下示例,因为没有简单的方法在堆栈溢出中传递guidefig 文件。

function TestNoGuide()
    clear all
    close all

    % Create figure
    hObject = figure('position', [800 400 260 100], 'Toolbar','none');
    % create structure of handles
    handles = guihandles(hObject);
    handles.hObject = hObject;

    handles.pushbutton1 = uicontrol('style', 'pushbutton', 'position',[10 20 100 40], 'string' , 'Button1');
    handles.pushbutton2 = uicontrol('style', 'pushbutton', 'position',[150 20 100 40], 'string' , 'Button2');
    set(handles.pushbutton1, 'callback', {@pushbutton1_Callback, handles});
    set(handles.pushbutton2, 'callback', {@pushbutton2_Callback, handles});

    %Save the structure
    guidata(hObject);
end


function pushbutton1_Callback(hObject, eventdata, handles)    
    [filename, pathname] = uigetfile({'*.xlsx;*.xls'});
    setappdata(0, 'filename', filename);
    setappdata(0, 'pathname', pathname);
end

function pushbutton2_Callback(hObject, eventdata, handles)   
    filename = getappdata(0, 'filename');
    pathname = getappdata(0, 'pathname');
    waitfor(warndlg(['filename = ', filename, '   pathname = ', pathname]));
end

检查一下,告诉我它是否在你的机器上工作......

【讨论】:

  • 没有成功。这是我在命令行窗口中分别写入路径名和文件名后得到的:未定义的函数或变量“路径名”。未定义的函数或变量'文件名。
  • 尝试在命令行窗口中写入pathname = getappdata(0, 'pathname')
  • 变量不是global,因此在命令行窗口中不可见(范围规则定义变量可见的位置)。您可以使用assignin('base','pathname',pathname)pathname 值传递给工作区。您是否尝试在按钮的回调中放置断点,然后在命令行窗口中写入pathname
  • 未定义的函数或变量“路径名”。 GUI_BP>pushbutton2_Callback 中的错误(第 106 行)fileID = fopen(strcat(pathname, filename), 'r'); gui_mainfcn 中的错误(第 95 行) feval(varargin{:}); GUI_BP 中的错误(第 42 行) gui_mainfcn(gui_State, varargin{:}); @(hObject,eventdata)GUI_BP('pushbutton2_Callback',hObject,eventdat a,guidata(hObject)) 中的错误在评估 UIControl 回调时出错我在上面遇到了这个错误。这是一个复杂的错误,还是很容易解决?
  • 看起来很简单:它所说的只是pathname 不是一个有效的变量。这是因为pathname“超出范围”。插入代码行:pathname = getappdata(0, 'pathname')fileID = fopen(strcat(pathname, filename), 'r');前一行代码
猜你喜欢
  • 2014-12-30
  • 2014-04-19
  • 1970-01-01
  • 2020-09-22
  • 2020-10-11
  • 2019-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多