用MATLAB2011a编写的 gui界面用久了,会出现卡顿怎么解决(重新打开就不卡了)怎么解决啊

用MATLAB2011a编写的 gui界面用久了,会出现卡顿怎么解决(重新打开就不卡了)怎么解决啊,第1张

先看在一个GUI界面内部的传递的数据

每一个控件的回调函数头:

function myc_Callback(hObject, eventdata, handles)

第一个参数是hObject,是跟这个callback所关联的控件的handles,在它自己的callback下,可以用代号-> hObject 来调用它。。不用管那么麻烦的概念,只用知道,控件自己的回调函数调用自己的属性,只用hObject属性名 就可以了(中间一点)。

第二个参数是MATLAB的保留参数

第三个handles,是这个GUI界面的代号。可以通过它获取这个界面的所有信息。所以在控件A自己的回调函数中,要获取或者设置别的控件的属性,就用 handles别的控件Tag属性

------------------------------

handles hObject 都是结构体。正常的编程概念。

handles格式是一个存放数据的缸。控件的handles是小缸,它的名字叫做hObject;GUI界面的handle是一个大缸,并且这个缸名字也叫做handles;大缸里存放了所有的小缸和所有用户数据,你只需 handles控件A的tag 就可以存取控件A的信息。

GUIDE创建了一个大缸:结构体handles,handles包括了figure中所有控件的句柄,也包括figure的句柄

比如一个GUI包括一个edit text, 一个panel,一个pop-up menu和一个push button,GUIDE用每个控件的tag来命名handle,handles结构体内容如下:

figure1: 1600011

edit1: 90020

uipanel1: 80017

popupmenu1: 70018

pushbutton1: 1610011

output: 1600011

那我怎么把自己计算出或者别的什么数据放到这个缸里呢?

^_^ 在任何地方

handles自己的变量名 = 某些值 (其实也就是给结构体添加成员变量)

这样你就定义了自己的变量。

在任何地方

b=handles自己的变量名 (结构名加点号来引用成员变量)

就可以得到这个变量值,同样也可以修改它。

别忘了使用

guidata(hObject, handles);(不用改,直接黏贴) 在函数末尾来保存你对handles和hObject的 *** 作。(不然你自定义的变量就没了)

%guidata( 视窗句柄 , 全部句柄 ),如果视窗句柄位置不是视窗句柄,而是一个控件的句柄,那么这个控件的父视窗(parent figure)会被调用。所以guidata中的视窗句柄 可以是figure的句柄,也可以是figure内所包含的控件的句柄,不管是哪种情况,最终handles会和figure相关联。全部句柄即GUI句柄handles

2 怎么在控件callback函数体之外获取控件和用户自己的数据

GUI界面的handles保存着所有控件的信息以及用户自己的数据,所以只要获取GUI的handles就可以获取所有。

比如在自己定义的函数里获取handles,只需将handles作为参数传进去就可以

function my_function(handles)

% handles是GUI的handles

%调用GUI内任意一控件的信息

%get(handles你控件的tag,'要获取的属性名');

temp=get(handlesmy_popup,'Value');

计时timer中:

% 在figure创建完成后创建 timer 对象,将handles传入Callback函数

t = timer('TimerFcn', {@timerCallback, handles}, 'ExecutionMode', 'fixedDelay', 'Period', 10);

% 设置窗口关闭的回调函数

set(handlesfigure1, 'DeleteFcn', {@DeleteFcn, t});

% 启动定时器

start(t);

%传入handles

function timerCallback(obj, event, handles)

temp=get(handlesmy_popup,'Value');

end

% 窗口关闭的响应函数-停止计时器

function DeleteFcn(hObject, eventdata, t)

stop(t);

end

3 在其他子函数或者非figure内控件的callback内保存用户数据到guidata

GUIDE中, GUIDE生成了一个包括所有GUI句柄的结构体:handles,我们可以保存用户数据到其中(GUIDE generates a handles structure that contains the GUI's handles You can add your own data to it)

guidata( 视窗句柄 , 全部句柄 )

如果视窗句柄位置不是视窗句柄,而是一个控件的句柄,那么这个控件的父视窗(parent figure)会被调用。所以guidata中的视窗句柄 可以是figure的句柄,也可以是figure内所包含的控件的句柄,不管是哪种情况,最终handles会和figure相关联。全部句柄即GUI句柄handles

guidata(hObject, handles);

在figure控件callback之内调用guidata(hObject, handles);,hObject是控件的句柄。如果在其他子函数或者非figure控件的callback知中使用guidata保存数据,hObject就不再是控件句柄,会出错。所以我们要用figure的句柄代替hObject,即handlesfigure1

guidata( handlesfigure1 , handles);

例如在上述计时器的callback函数中保存data: guidata( handlesfigure1 , handles);

4、在不同GUI之间传递数据

传入

那就来看打开一个GUI界面时,传给他的参数有哪些。

function mygui_OpeningFcn(hObject, eventdata, handles, varargin)

所有的启动参数都是通过varargin传到它的OpeningFcn里面的。那启动参数可以是哪些呢?

1、figure,也就是窗口参数。

比如说position之类

例如:打开这个GUI时,使用这个命令 mygui('Position',[434 234 234 34])则表示打开窗口在这个位置;还有哪些可控属性可以查help。

2、自定义参数 。

如果传入的参数不是figure的属性(matlab查找不到你输入的属性名),则你输入的参数作为一个向量存放在varargin里面。

比如mygui('路人甲','80‘),那varargin{1}存放了'路人甲',varargin{2}=’80‘

那mygui中对这读取两个数据进行反应,就达到了传入参数的目的。

传出

那怎么把数据传出来呢?

将你要输出的数据存在handlesoutput里面

在GUI任意地方

handlesoutput=数据1;

handlessecend_output=数据2;

然后在GUI的outputFcn里面加上

varaginout{1}=handlesoutput;

varaginout{2}=handlessecend_output;

这样就把数据传出来了。

看每一个GUI的最外层的那句

function varargout = mygui(varargin) 看输入输出,就是这样了。把GUI本身就是一个函数,

b=mygui(一些传入的参数) 就执行GUI并返回结果

则b就得到了传出来的结果。

function figure1_WindowButtonMotionFcn(hObject, eventdata, handles)

p=get(gca,'CurrentPoint') ;%获得句柄

msgstr = sprintf('x = %33f; y = %33f',p(1),p(2)); %获得位置

xianshi= uicontrol('style','text','position',[100 100 100 20],'string',msgstr);

function pushbutton1_Callback(hObject, eventdata, handles)

% hObject handle to pushbutton1 (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

a1=str2num(get(handlesedit1,'string'));

a2=str2double(get(handlesedit2,'string'));

a3=str2double(get(handlesedit3,'string'));

a4=m(a1,a2,a3);

set(handlestext2,'string',num2str(a4));

set(handlestext2,'string',num2str(a4));

m文件

function a4=m(a1,a2,a3)

syms x

a4=int(a1,x,a3,a2);

不知道你解决了没,最近正好研究python。

hwnd=win32guiFindWindow()这个获取窗体句柄,大概都会用;

ctrl=win32guiFindWindowEx(hwnd,None,'窗口类名',‘标题文本’)已知控件类名或控件名时获取控件句柄,这个标题文本不一定存在,所以使用None默认值获取的是该窗口类名中第一个顺位的控件句柄。

你使用b=win32guiGetDlgItem(edit,资源ID)最终结果是获取的是句柄,这里的资源ID其实是spy++中的窗口ID,句柄是可变的,窗口ID是不可变的。这里似乎错了,你这样子大概获取的是控件中的子项(控件有子项的话,比如Combox中的edit框),我猜的,没试过。b=win32guiGetDlgItem(hwnd,窗口ID)是已知ID下获取某控件句柄

如果你想获取某个控件的ID则ctrlid=win32guiGetDlgCtrlID(ctrl)这是一只某控件句柄的情况下获取该控件在应用程序中的窗口ID。

如果不知控件句柄的情况下大概可以试试spy++获取窗口ID,把窗口ID(这个是16进制的)转化成10进制带进b=win32guiGetDlgItem(hwnd,窗口ID)大概也可以得到控件句柄。

其实就是三个函数之间的转化

ctrl=win32guiFindWindowEx(hwnd,None,'edit',None)控件句柄

ctrlid=win32guiGetDlgCtrlID(ctrl)控件的窗口id

ctrl2=win32guiGetDlgItem(hwnd,ctrlid)控件句柄

print "%x" %ctrllist

print "%x" %ctrlid

print "%x" %ctrl

输出,看一下数据与spy++是否一致。然后ctrl=ctrl2

以上就是关于用MATLAB2011a编写的 gui界面用久了,会出现卡顿怎么解决(重新打开就不卡了)怎么解决啊全部的内容,包括:用MATLAB2011a编写的 gui界面用久了,会出现卡顿怎么解决(重新打开就不卡了)怎么解决啊、Matlab GUI(axes中)如何获取鼠标点击时的位置、matlab设计gui文本框,怎么获取文本框输入的字符呢等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9299004.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存