matlab gui实现滑动条和静态文本同步显示

这个小程序主要实现了输入n次交易和p个物品,随机产生n行p列的购物清单。其中p值最大不能超过30列,因为我设计的编码数组最大只有30列。

1、产生购物清单的程序代码:

function T=produce_T(n,p)
% 产生随机交易矩阵
T= randi([0,1],n,p);
% 编码库  大概有30类物品
MyCodes={'奶酪','糖果','足球','衣服','靴子','鸡肉','洗面奶','沐浴露','洗发水','梳子','镜子','电池','发夹','戒指','胸针','复印机','耳机','字典','充电器','围巾','领带','西服','饮水机','台球','指南针','毛巾','热水瓶','水杯','鼠标','卫生纸'};
Total_num=length(MyCodes);
% 产生编码规则矩阵 randperm(N,K) 产生1-N的不重复的数,K个
code=MyCodes(randperm(Total_num,p));

% 生成购物清单txt
fid=fopen('mygoods.txt','w');
for i=1:size(T,1)
    % 获得元素为1的列下标
    [~,ib]=find(T(i,:)==1);
    % 进行编码 将cell数组转化为字符数组
    code1=code(ib);
    % 因为不同的cell之间不会有空格,需要手动添加
    code2=cellfun(@(u)[u,' '],code1(1:end-1),'UniformOutput',false);
    str_arry=cell2mat(code2);
    % 写入文件
    fprintf(fid,'%s\n',str_arry);
end
fclose(fid);
disp(['生成购物清单到''mygoods.txt' '完成!']);

购物清单如图所示:n=10,p=20。


2、设计matlab的GUI界面

2.1、fig界面: 


需要注意静态文本框的max需要大于1,进度条默认为0-1之间变化。

2.2 相关代码

2.2.1读取编辑框中的交易次数:

function n_Callback(hObject, eventdata, handles)
% hObject    handle to n (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of n as text
%        str2double(get(hObject,'String')) returns contents of n as a double
n=str2double(get(hObject,'String'))
if n<=1
    errordlg('交易次数不能少于1')
elseif n~=fix(n) 
    errordlg('输入必须为整数');
end

2.2.2读取编辑框中的物品种类:

扫描二维码关注公众号,回复: 2151671 查看本文章
function p_Callback(hObject, eventdata, handles)
% hObject    handle to p (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of p as text
%        str2double(get(hObject,'String')) returns contents of p as a double
p=str2double(get(hObject,'String'))
if p<=1 || p>30
    errordlg('物品个数不能少于1或者多于30');
elseif p~=fix(p)
    errordlg('输入必须为整数');
end

我做了一些输入校验,不能输入除整数之外的字符。

2.2.3 点击确认按钮之后的事件:

% --- Executes on button press in pushbutton1.
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)
n=str2double(get(handles.n,'String'))
p=str2double(get(handles.p,'String'))
if n<=1 || p<=1 || p>30
    errordlg('交易次数或物品个数不能小于1');
    return
elseif n~=fix(n) || p~=fix(p)
    errordlg('输入必须为整数');
    return
else
    T=produce_T(n,p);
    % 加载文档中的内容
    ex=importdata('mygoods.txt');
    row=size(ex,1)
    if row>24 % 24假设为最大显示行数
        set(handles.T_data,'String',ex(1:24));
        % 设置滑动条位置 不能取整
        x=24/row;
        set(handles.slider1,'Value',(1-x));
    else
        set(handles.T_data,'String',ex);
        % 设置滑动条位置
        set(handles.slider1,'Value',0);
    end
  
end
produce_T(n,p)是最前面写的购物清单的代码。

我设置的最大显示行数为24行,小于24,就直接将滑动条位置移动到最底部,不能在下滑。大于24,则计算24行所占总行数的比例,设置滑动条处于计算出来的位置。

效果图如下:


2.2.4 滑动条移动的事件

% --- Executes on slider movement.
function slider1_Callback(hObject, eventdata, handles)
% hObject    handle to slider1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'Value') returns position of slider
%        get(hObject,'Min') and get(hObject,'Max') to determine range of slider

ex=importdata('mygoods.txt');
row=size(ex,1)
if row>24
%     set(hObject,'Value',1-24/row);
    slider = get(hObject,'Value')
    x1=1-slider;
    % 取得当前需要显示的数据量
    count=round(row*x1)
    if count>24
        % 显示对应数据
        set(handles.T_data,'String',ex(count-24:count));
    end
else
     % 显示对应数据
     set(handles.T_data,'String',ex(1:row));
     set(hObject,'Value',0);
end

如果总的行数小于24的话,则直接显示所有数据,并将滑动条置于底部。若大于24的话,则先获取当前的滑动条值,再计算出当前所需要显示的数据量,最后显示当前数据量-24——当前数据量区间的数据。

效果图:


txt文件:




猜你喜欢

转载自blog.csdn.net/qq_28228605/article/details/80035195
今日推荐