在chat上问这个问题,它会告诉你拖进一个progress bar什么的——这个答案是完全没有帮助的,根本搜不到现成的这种控件。
而如果你自己按照原理设置进度条,比如在循环中更新画图或者文字,又会发现matlab app好像视若无睹一样,会在整个循环结束后,才姗姗来迟地显示最后一次循环的结果。
那么这是为什么呢?
就是因为缺少了图窗更新指令drawnow。
在Matlab APP Designer中如何制作进度条(字符型进度条)_app designer 进度条_奋进的小hang的博客-CSDN博客
其实之前就看过这位博主的博客,但是没有注意关键的drawnow,导致最后还是被matlab视若无睹失败。
自从意识到了drawnow加了drawnow,雨过天晴啊!突然这个进度条就能用,且变得很流畅了。
关于drawnow的更新速度是否适合需求:Matlab中drawnow函数的使用_matlab drawnow_jk_101的博客-CSDN博客
每秒20帧我觉得一般计算也够用了,没有那么快。
那么参考其他博主做字符型的,在matlab app里嵌入一个图像形态的也不是难事。
waitbar因为会另外跳出一个对话框,可能不适合matlab app用(我也没有试过,可以试一试)。
于是笔者想出了加一个绘图区即UIAxes,然后用plot,x值为循环到的位置,y值固定为1,绘制直线,搞得粗一点,就有进度条的感觉了。同时,对这个绘图区的标题也进行实时刷新,实现文字和进度条同时变化的状态
%开始循环,笔者这里是读了一个文件夹里的所有文件循环执行
%fileno是这个文件夹里文件的个数
%app.jindu1 是添加的“伪进度条”,也就是坐标区的名字
%在开始前,首先要固定一下进度条的长度,为fileno,用xlim设置。
app.jindu1.XLim=[0,fileno];
for f=1:fileno
plot(app.jindu1,1:1:f,ones(f),Color='b',LineWidth=3);
title(app.jindu1,strcat("进度 ",string(f),"/", string(fileno)))
drawnow
%.....后面是具体的计算
end
来看看效果(忽略水印):
基本上和运算是完全同步的。
成功~