matlab按钮生按钮
在使用matlab的时候实践了一个有趣的问题,一个我以前也曾想过但从未去实施的想法。
比如说在编程的时候,变量的名字可以在运行的时候临时生成吗?还有在设计UI的时候是否可以设计成运行中界面可以根据某些变量值进行改变,在某处增加一个按钮,生成一个新的界面之类的。
这个问题应该非常容易回答,如果使用的语言是编译型的C/C++/…,那么答案是不可能。所有的函数功能、变量名称、UI组件都必须在编译的时候确定下来,不能再改变,除非。。除非程序员让程序自己临时生成代码并编译连接运行?。。相反,解释型的语言js/matlab/…理论上就没有这种障碍。所谓解释就是在程序运行时通过解释器实时地将源代码转换成二进制,也就意味着程序运行是随时可以生成新的代码交给解释器去解释执行。
以matlab为例,如果我想生成新的代码去执行,那这些生成的代码是string类型的,matlab中有一个神奇的函数可以把它的string参数转当成语句执行——它就是eval()
现在我想做一个只有一个按钮的图形程序,按下按钮的功能就是在原按钮下方再生成一个具有同样功能的按钮。
最开始的界面是这样的(只有一个按钮):
对应的,程序源代码中也只有一个响应函数pushbutton1_Callback(),要生成多个按钮,这个响应函数有讲究,代码如下:
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)
answer = getpixelposition(hObject);
Xpos = answer(1);
Ypos = answer(2);
width = answer(3);
height = answer(4);
Ypos = Ypos - height - 3;
num = getappdata(handles.pushbutton1,'buttonNO');
tag = ['btn',num2str(num)]; %此处按钮的句柄名字用变量产生
state = [tag,' = uicontrol(''Style'',''pushbutton'',''String'',''Push Me ',num2str(num),''',',...
'''position'',[',num2str(Xpos),' ',num2str(Ypos),' ',num2str(width),' ',num2str(height),'], ',...
'''FontSize'',10);'];
上面这句产生了一代表语句的string,注意=左边的变量名tag是’btn’+’数字’,数字每次调用callback时递增
eval(state);% 新建一个按钮,设定显示文字、字体大小和位置
num = num+1;
setappdata(handles.pushbutton1,'buttonNO',num); %按钮的个数加1
state = ['handles.',tag,' = ',tag,';'];
eval(state);% 将该按钮的句柄加到handles上
guidata(hObject,handles);% 更新handles
state = ['set(',tag,',''Callback'',{@pushbutton1_Callback,handles});'];
eval(state);
按下按钮的效果:
总结起来,虽然编译型的语言更高效更接近硬件,但是解释型语言有着更灵活(这次的例子)、方便地跨平台的特性,在现在硬件水平大发展的情况下、在一般的程序需求下,编程人员更看重的是方便而不是效率。也就不难理解为什么现在新出现的语言大多是解释型的。
你的毕设要用到matlab的?
不出意外的话是要用Matlab的