一个展示用GUI
为啥做这个
应导师的要求,要给项目做个简单的GUI,用于糊弄甲方;某师兄虽然会但是显然不想接锅
想着自己原来也做过,正好借这个机会再学学怎么做GUI,以后自己的程序也能做出来好看的GUI唬人
以下为演示视频,如果糊了就是bilibili的问题,可以点进去看
开发环境
虽然之前我的第一个GUI是用Tkinter开发的来着,但是啊,一言难尽的丑呢~
而且开发了一半才知道大家伙儿都不用这玩意儿
下载完之后,就用designer设计界面了
不过这么多能用的组件,一下也不知道什么能用,再分享一个链接,可以对着找自己想要的效果
我的
长啥样儿?
因为我的博客都在laptop上更新,但是环境搭建在办公室
今儿回宿舍一看,pyqt5之前安装过一次,但是现在环境冲突,搞得乱七八糟
干脆也不想整了,所以这里没有designer的图了
放个半成品
实现
读取一个文件
1 | #将[select_file]函数绑定在名叫[read_sgy]的按钮上(在designer里命名) |
这个函数会读取指定的文件,并且通过全局变量存储数组以降低代码复杂度。这里添加了一些其他的输出值,虽然没啥用,但是有也不是一点用没有。不过其实可以写个质量控制啥的,try函数什么的(对于我自己来说,我不需要用这种函数,对于潜在客户,啊,谁管他们啊~~)。
获取一个路径&保存文件
感谢二师兄给的输出函数1 | ui.trans2sac.clicked.connect(st2sac) |
这里就不演示了,没啥好看的
参数设定&预处理
这里用了几个输入窗口来获取参数,这应该是最简单的办法(其实滑块我也会了,但是没必要是吧)
但是在滤波方法上加了个多选框,这都是在designer里直接拽进来就行了,自己打几个字就成
最后在需要取参数时,使用.text()函数就好了
1 | short=int(ui.shortwin.text()) |
画图
有时候不得不说,偷懒真是第一生产力
本来想着用pyqt5新建一个窗口内嵌matplotlib的办法来画图,但是突然想到为啥不能直接让matplotlib弹出来窗口呢?试了一下还真可以,而且发现matplotlib可以用按钮进行交互,ok那就这么搞了~
以下为臭长的代码,包含了三个画图函数,我用注释来强调一下需要注意的地方
1 | # 这里为什么要用全局函数呢? |
后续实现的内容
- 到时拾取需要增加上去,不过顶多就是点几个点罢了
- 加个波形图上去
- 可能需要输出拾取的结果,我想的直接放到matplotlib那里更合适一点
- 批处理是一件非常值得考虑的事情,但是又不是我用,先不做了~
- 换个好看的录屏软件
限制用户行为
笑话[酒吧]:- 一个测试工程师走进一家酒吧,要了一杯啤酒;
- 一个测试工程师走进一家酒吧,要了一杯咖啡;
- 一个测试工程师走进一家酒吧,要了 0.7 杯啤酒;
- 一个测试工程师走进一家酒吧,要了-1 杯啤酒;
- 一个测试工程师走进一家酒吧,要了 2^32 杯啤酒;
- 一个测试工程师走进一家酒吧,要了一杯洗脚水;
- 一个测试工程师走进一家酒吧,要了一杯蜥蜴;
- 一个测试工程师走进一家酒吧,要了一份 asdfQwer@24dg!&*(@;
- 一个测试工程师走进一家酒吧,什么也没要;
- 一个测试工程师走进一家酒吧,又走出去又从窗户进来又从后门出去从下水道钻进来;
- 一个测试工程师走进一家酒吧,又走出去又进来又出去又进来又出去,最后在外面把老板打了一顿;
- 一个测试工程师走进一家酒吧,要了一杯烫烫烫的锟斤拷;
- 一个测试工程师走进一家酒吧,要了 NaN 杯 Null;
- 一个测试工程师冲进一家酒吧,要了 500T 啤酒咖啡洗脚水野猫狼牙棒奶茶;
- 一个测试工程师把酒吧拆了;
- 一个测试工程师化装成老板走进一家酒吧,要了 500 杯啤酒并且不付钱;
- 一万个测试工程师在酒吧门外呼啸而过;
- 一个测试工程师走进一家酒吧,要了一杯啤酒’;DROP TABLE 酒吧;
- 测试工程师们满意地离开了酒吧。
- 然后一名顾客点了一份炒饭,酒吧炸了。
按照墨菲定律(不是),用户一定会沿着与设计理想不同的方向使用软件,所以适当的控制用户行为还是必要的,这里加入了对按钮的限制:
- 不导入文件时,无法进行后续操作(因为文件数组并没建立)
- 不滤波无法拾取,这是为了保证处理质量
- 不拾取无法画图及保存结果,这是防止相关代码收到空数组
实现代码:
1 | ui./*item——name*/.setEnabled(0) |
波形图界面
滑动条的实现
这里采用了调整y轴范围的方法来进行上下滑动,同理可以进行左右滑动,但是没必要。虽然上下滑动可以用放大镜代替,但是有个滑动条要友好的多,实现代码如下:
1 | def ax_begin(event): |
间隔条和密度条
密度条可以调整界面中的道数,使得显示范围更大,方便看出波场的变化。
间隔条允许跳过部分道的波形显示,这能够进一步获得更大的视野,代价是道间距变大。
1 | def ax_num(event): |
显示内容的变化
这个功能看起来很好用,甚至让我觉得我日常应该也能用得到这个gui了,但是实现起来非常简单
1 | #这里设置全局变量,可以保存状态,并且指示多选框选中和弃用时,对应的显示状态 |
完整的波形图界面代码
1 | def new_figure2(): |
后日谈
这个GUI做到这里基本就已经成型了,其实可以增加更多的功能来丰富,但是属实没必要。不过在写这个GUI时我学到了不少pyqt5的基础语法,这还是让我有所受益的,也许在我完成了地震检测、定位以及去噪的工作后,我可以用pyqt5集成一个DAS的多功能终端,想来还是挺酷的。
不过这个GUI还是有不少可以改进的地方的,比如应该加入try语法,吧错误信息打印到log栏里,而不是直接退出,但是还是那句话,这个GUI的设计也不是我用,随意一点好了~
这个程序不算难,直接分享了
虽然理论上不需要,但是使用前还是应该先给我打个招呼~