matlab gui plot没反应,MATLAB GUI中的几个难点

本文详细解析MATLAB GUI编程中遇到的挑战,包括了解自动生成的m文件结构、控件回调函数类型及其参数含义,以及参数传递的各种方法。重点讨论了如push button、static text和slider等控件的使用,并介绍了如何打开文件、获取矩阵尺寸以及set和get函数的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,了解自动生成的m文件的结构。

function varargout =

sEMG_shujuchuli(varargin)

% SEMG_SHUJUCHULI MATLAB code for

sEMG_shujuchuli.fig

%  SEMG_SHUJUCHULI, by itself, creates a new

SEMG_SHUJUCHULI or raises the existing

%  singleton*.

%

%  H = SEMG_SHUJUCHULI returns the handle to a new

SEMG_SHUJUCHULI or the handle to

%  the existing singleton*.

%

%  SEMG_SHUJUCHULI('CALLBACK',hObject,eventData,handles,...)

calls the local

%  function named CALLBACK in SEMG_SHUJUCHULI.M with

the given input arguments.

%

%  SEMG_SHUJUCHULI('Property','Value',...) creates a

new SEMG_SHUJUCHULI or raises the

%  existing singleton*.  Starting

from the left, property value pairs are

%  applied to the GUI before

sEMG_shujuchuli_OpeningFcn gets called.

An

%  unrecognized property name or invalid value makes

property application

%  stop.  All inputs are passed to

sEMG_shujuchuli_OpeningFcn via varargin.

%

%  *See GUI Options on GUIDE's Tools menu.

Choose "GUI allows only one

%  instance to run (singleton)".

%

% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to

help sEMG_shujuchuli

% Last Modified by GUIDE v2.5 18-May-2017

10:06:39

% Begin initialization code - DO NOT

EDIT

gui_Singleton = 1;

gui_State = struct('gui_Name',  mfilename, ...

'gui_Singleton',

gui_Singleton, ...

'gui_OpeningFcn',

@sEMG_shujuchuli_OpeningFcn, ...

'gui_OutputFcn',

@sEMG_shujuchuli_OutputFcn, ...

'gui_LayoutFcn',

[] , ...

'gui_Callback',

[]);

if nargin &&

ischar(varargin{1})

gui_State.gui_Callback = str2func(varargin{1});

end

if nargout

[varargout{1:nargout}] = gui_mainfcn(gui_State,

varargin{:});

else

gui_mainfcn(gui_State, varargin{:});

end

% End initialization code - DO NOT EDIT

% --- Executes just before sEMG_shujuchuli is made

visible.

function sEMG_shujuchuli_OpeningFcn(hObject,

eventdata, handles, varargin)%对话框打开的时候执行的函数,可以做一些初始化的工作。它在GUI未显示之前,控件的createfcn函数执行之后执行。

% Choose default command line output for

sEMG_shujuchuli

handles.output = hObject;

% Update handles structure

guidata(hObject, handles);

% --- Outputs from this function are returned to

the command line.

function varargout =

sEMG_shujuchuli_OutputFcn(hObject, eventdata, handles) % 在控制回到命令行之前和opening

function 返回控制之后,返回输出到MATLAB的命令行

% varargout  cell array for

returning output args (see VARARGOUT);

% hObject  handle to figure

% eventdata  reserved - to be

defined in a future version of MATLAB

% handles  structure with handles and user data (see

GUIDATA)

% Get default command line output from handles

structure

varargout{1} = handles.output;

右键面板上的控件可以定位到该控件的callback函数区,有的没有callback函数,但会有createfcn函数,createfcn函数下可以写这个控件的初始化设置,deletefcn函数区可以写退出控件时的一些操作。

callback有很多种类型,各个控件拥有的类型也不同,不同的callback函数可以对特定的事件作出反应,比如push button 有ButtonDownFcn, Callback, CreateFcn, DeleteFcn, and KeyPressFcn 5种类型的callback,可以对按键按下,创建和销毁等事件作出反应。不仅如此,figure也有很多类型的callback比如

回调函数的几个参数含义:

function listbox1_Callback(hObject, eventdata,

handles)

hObject:对象的句柄,在这就是这个回调函数对应的对象的句柄,可以用这个控件设置的Tag代替,但最好直接用hObject,因为它能代表很多类型的控件句柄。

eventdata :用户触发的事件序列

handles :一个结构体,里面包括GUI中所有对象的句柄,以及一些用户定义的数据。有一种参数传递的方法就是用它存储用户定义的数据。

部件的CreateFcns

在GUI第一次运行时只执行一次,而opening function每次GUI被引用时都会执行一次

2.参数传递问题

在网上找到的说是有6种方式,

1). 运用global定义全局变量传递参数(适用于gui内控件间以及不同gui间)

这种方式恐怕是最简单的方式,是很省心!但是但是,简单的问题就在于有时你会很头疼!因为在每一个要到该全局变量的地方,你都要添一句gloal x,还有就是如果你在一个地方修改了x的值,那么所有x的值就都变了!有的时候恐怕会出现紊乱。另一个更重要的问题在于,套用C++的一句话,全局变量破坏了程序的封装性!所以,全局变量是能少用尽量少用。

2)应用setappdata\getappdata与rmappdata函数(gui间和gui内,推荐使用)

使用上面三个函数最有弹性处理数据的传送问题,与UserData的方式相类似,但是克服UserData的缺点,使一个对象能存取多个变量值。

(1)getappdata函数

VALUE=getappdata(H,‘’NAME‘’)%H指的是句柄,比如hObject指的是当前控件,handles.figure1指figure1这个GUI,handles.text1指的是text1这个控件,0指的是最高级的窗口对象句柄,关于句柄,有几个常用的,在后面总结。注意这里要用一个变量存储从Application

Data拿到的变量,我一开始忘了,总是出错。NAME是在setappdata()中设置的变量名,使用的时候加引号。我们可以发现这种方法跟使用userdata的方法相似,其实这只是一个选择问题,看你是想用userdata还是用application data存储数据,他们之间的区别就是userdata只能存储一个值,而setappdata的方法可以存储多个值,事实上application

data通常被定义为结构体。

(2)setappdata函数

setappdata(H,‘’NAME‘’,VALUE)%NAME是自己定义的一个变量名,VALUE是自己要存储的变量,可以是任何形式的,数组,向量或者结构体等,取决于它被初次使用时的变量类型。

(3)rmappdata

rmappdata(H,NAME)%移除命名过的应用数据

isappdata(h,name)%如果name存在于application data中返回true否则返回false

当在主子gui内调用时,可以如下设置

fig1调用fig2时,使用fig2指令来打开fig2,

在fig2的m文件中,在回调函数中用setappdata(fig1,'A',A)实现返回fig1,并将参数A传递给fig1

然后在fig1的使用A的地方添加A=getappdata(fig1,‘A’)。

但这种方式的一个问题就是没调用一次,fig1的数据就得初始化一次,这是因为setappdata(fig1,'A',A)中出现了fig1,调用一次setappdata就得运行一次fig1的缘故,解决方案就是把setappdata(fig1,'A',A)改为setappdata(0,'A',A),这样把A读入matlab

workspace,相当于一个全局变量了,但当然比直接用global定义全局变量好!

3)

运用save和load(importdata)传递参数(gui内和gui间)

将某变量x的值先存到磁盘,用的时候在调用。格式如下:save('*.mat','x');用的时候就用load('*.mat'),但这样只是把x读到了matlab

workspace,不会用显示,你还要再去查看这个变量名,然后才能用,建议使用p=importdata('*.mat'),p是一个结构体,可以随意使用了。当然,这种方式涉及到磁盘读写,速度当然会有影响的,一般情况不用,通常用在保存以及导入某个变量时!

4)结合handles和guidata函数(gui内,不推荐使用,经常出现问题,比如在handles中添加了变量对象Y后可能就会挤掉handles另外一个对象)guidata是创建和管理handles的函数,handles是一个结构体,里面包括了GUI所有的部件的句柄,这里面的东西不能动,如果想要用它传递参数,就必须先给这个结构体增加新域,再用

guidata(hObject,handles)保存在这个结构体里,不然动了那些句柄就会导致有些控件找不到句柄而不可用。

他的使用格式如下,如果你在pushbutton1中得到一个变量X,相传出去,那么在pushbutton1的callback中,在得到X后添加如下代码:

handles.X=X;%为handles结构体增加一个X域并赋值

guidata(hObject,handles)(注意,一定是两行连写)

在pushbutton2中要用到X是,在其callback先添加 X=handles.X;即可得到X的值。

5)

运用UserData传递参数(gui内)

每个控件和GUI都有一个userdata区,可以存储用户定义的数据,我们通过H找到这个存储区。直接通过对象的userdata属性,进行各个callback之间的数据存取操作。首先必须将数据存储到一个特定的对象中,假设对象的句柄值为ui_handle,需要存储的值为value,则输入以下程序即可:

set('ui_handle','UserData',Value);

此时,value数据就存在句柄值为ui_handle的对象内,在执行的过程中若要取回变量可以通过以下方式在任意callback中获取该数据值:

value=get(''ui_handle,'UserData');

虽然使用这种方法简单,但是每个对象仅能存取一个变量值,因此当同一对象存储两次变量时,先前的变量值就会被覆盖掉,因此都用UserData存储简单与单一的数据。如下面有两个gui函数, myloadfn加载mydata.mat文件,该文件内存储XYData变量,其值为m*2的绘图矩阵,加载后将该变量值存储到当前的窗口的UserData属性中。另一个myplotfcn函数则是用以获取该UserData属性中存 取的绘图数据,然后绘图。代码如下:

function

myloadfcn

load

mydata;

set(gcbf,'UserData',XYdata)

function

myplotfcn

XYdata=get(gcbf,'UserData');

x=XYData(:,1);

y=XYData(:,2);

plot(x,y);

6). 输入参数传递:

比如子GUI的名称为subGUI, 设想的参数输入输出为:[out1, out2] = subGUI(in1,

in2)

在subGUI的m文件中(由GUIDE自动产生):

1.第一行的形式为:function varargout =

subGUI(varargin)

该行不用做任何修改;varargin 和

varargout

分别是一个可变长度的cell数组(MATLAB帮助文件中有说明)。输入参数in1和in2保存在varargin中,输出参数out1,out2包含在varargout中;

2.在subGUI的OpeningFcn中,读入参数,并用guidata保存,即:

handles.in1 = varargin{1};

handles.in2 = varargin{2};

guidata(hObject, handles);

返回参数的设置:

1. 在GUI子程序的OpeningFcn函数的结尾加上uiwait(handles.figure1);

figure1是subGUI的Tag;

2. subGUI中控制程序结束(如"OK”和"Cancel"按钮)的callback末尾加上uiresume(handles.figure1),不要将delete命令放在这些callback中;

3. 在子GUI的OutputFcn中设置要传递出去的参数,如 varargout{1} = handles.out1;varargout{2} = handles.out2;末尾添加

delete(handles.figure1);

结束程序。

在GUI的OpenFcn中,如果不加uiwait,程序会直接运行到下面,执行OutputFcn。也就是说程序一运行,返回值就确定了,再在其它部分对handles.output作更改也没有效果了。

加上uiwait后,只有执行了uiresume后,才会继续执行到OutputFcn,在此之前用户有充分的时间设置返回值。

通过以上设置以后,就可以通过 [out1, out2] =

subGUI(in1, in2) 的形式调用该子程序。

在一个GUI中调用另一个GUI时,主GUI不需要特别的设置,同调用普通的函数一样。在打开子GUI界面的同时,主程序还可以响应其它的控件。不需要担心子GUI的返回值被传错了地方。

3.各个控件使用方法

push button:最简单也最常用,只要在callback区写函数就行了,没什么要注意的,能使用上述参数传递的方法加上一些基本的编程能力就能实现很多功能。

static text:可以在上面显示文字,很常用。使用set(handles.text1,'string','请按使用说明正确操作' );就能完成文字显示,将它写在GUI的初始化函数

function sEMG_shujuchuli_OpeningFcn(hObject, eventdata, handles,

varargin)

下就能在打开GUI时就在静态文本框区显示字符串。将它写在其他控件的callback下就能让其他控件控制静态文本框的显示。

这个显示的字符串会根据文本框的大小自动的换行,但是要自己用\n控制换行,我还不会, 网上有的介绍是使用多个文本框分别设置的方法。

要实现输出字符和数字可以使用set(handles.text1,'string'['行:',num2str(m),'列;',num2str(n)]);

slider:滚动条,一个很有意思的点,我们搞出来的滚动条只有垂直的,而不知怎么搞出水平的,上网查了一下,原来他的水平和竖直是根据width和height的值确定的,你将他拉成宽更大的,就是一个水平的,将他的高拉成更大的就是一个竖直的滚动条。它的步进值可以双击它在参数表中设置水平步进和竖直步进(sliderstep,这个里有两个参数,原来不知为什么,想想产生水平滚动条的方式,也就明白了。)还可以在里面设置最大值,Max和最小值Min。初始时是1和0.

要使用滚动条设置的值可以用slider_value_xun =

get(hObject,'Value');

panel:面板。可以将几个控件分区。

axes:绘图控件。可以在里面显示图像等。在其他控件(想要控制axes显示图像的控件)的callback下写

axes(handles.axes1);就能成功把绘图区定位到axes1这个控件上。然后在下面可以plot(),画出的图就会显示在axes1这个控件上。

4.打开文件

[filename,pathname]=uigetfile({'*.txt;*.csv'});%交互式的打开TXT和csv格式的文件,取得文件名和路径。

f = fullfile(pathname, filename);%合成完整的文件路径

input = dlmread(f, '\t');%打开文件并保存

5.获取二维矩阵的行数和列数

input = dlmread(f, '\t');

[m,n]=size(input);%m是行,n是列

6.set()和get()函数

slider_value_xun =

get(hObject,'Value');

其实跟getappdata()是一样的,只是能力大小不同,应用也就不同。

7.将一个变量设置为数组类型

a=[];

MATLAB中数据类型是根据赋值的数据类型变化的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值