记录一次基于PyQt5的标准铂电阻温度计分度表制作界面设计

- 一些想说的话

这是我的第一篇CSDN文章,之前都是在这上面参考别人的东西,感觉这里有点鱼龙混杂的意思。。。反正估计我写的东西也没人看,所以允许我聊一下我最近的生活,事情是这样的,本来在海康威视实习的我过着每天重复起床上班下班躺床上玩手机睡觉的无聊生活(要不是迫于生计谁会想去工作呢(doge)),一天下午,导师叫我去学校一趟(上班的地方要去学校可是有1个多小时的路程啊=-=),没办法,请假去呗,于是到学校,就有了这个项目,一个基于PyQt5的铂电阻温度计分度表制作的项目,无非就是让研究人员填入相关的实验数据,计算出一些参数,最后得出标准铂电阻温度计分度表的过程,因为之前接触过一点PyQt5,所以乍一看感觉这个项目对于我来说难度不高(我现在还没有做完,所以不敢装B=-=)。于是回到家后,就开始做呗(不过说实话,在家的效率是真低。。。),想到当时考研那个暑期在家玩了整个暑假的惨痛经历,于是我发誓这个暑假一定不能疯玩了,还是得做些事情了(毕竟自己也老大不小了(doge))。今天写这篇文章的意义呢,首先是有点心血来潮了,想跟大佬们交流交流;其次呢,项目也做了一段时间,有些东西(存在问题啊,或者我从中学到的一些东西等等)想记录下来,能改进的话最好了,希望有人看到。。。

- 大致内容

这次的基于PyQt5的标准铂电阻温度计分度表制作界面呢,我想分为两个窗口(对了,我还不知道怎么跳转第三个窗口,就是两个窗口可以相互跳转是可以实现的,但是在第二个窗口加入跳转按钮,采用和前面一样的方式却不可以,我也不知道为什么/(ㄒoㄒ)/~后期还得学学),第一个窗口我暂且称之为“信息输入窗口”,就是在这个窗口中,实验员需要将相关的测量信息输入进来,然后就点击按钮得出另外一些计算参数的结果,我今天的这篇文章就是基于这个信息输入窗口(第二个窗口正在加急施工loading。。。),说多无益,设计界面的图在下方:

按照相关文献数据,运行实验数据如图:

允许我解释一下这个界面的运行过程,首先要选好实验所需的标准等级,这影响到之后的数据小数位数的保留(图中选取的为一等标准),选好等级之后,点击tabWidget中的Zn点校准记录和Sn点校准记录,每次填完一次实验的Rt1和Rt2后点击计算,即可得出平均值到Wzn(Wsn)之间的所有数据,当实验人员完成Zn点和Sn点两次实验相应的Rt1以及Rt2后,再点击右边的确定按钮,GroupBox校准结果和短期判别以及RTP最大最小值的数据都会根据文献的计算式相应得出(忽略W100和Wga两个参数,因为我真的找不到它们的计算式/(ㄒoㄒ)/~) ,这就是我所设计的第一个信息输入界面了。

- 项目制作中学到的一些知识汇总

1. “组合布局”

在Qtdesigner中,采取了“组合”布局(当然它不叫这个名字,这个是我称呼的=。=)的方式(也就是先将一部分控件布局,再把零碎的布局组成总布局),如图就是先运用了两个垂直布局,再将两个垂直布局进行水平布局(原谅我之前这个都不会/(ㄒoㄒ)/),我之前都是“目测”布局的方式。。。我觉得还是按照布局的规范来要好一些==之前的目测布局真的对不齐好丑;

2. “空壳”程序

在没插入任何事件函数的时候,ui的“空壳”(也就是看看你的ui没有任何功能的样子)运行程序如下:
*解释一下:我知道这个只要做过PyQt5的人都明白这个东西,而且网上的版本五花八门,但是我在这写下来是因为我以后再做相关的项目时只套用这个版本,也就是不再去网上找寻其他的运行程序了,这样解决了我以前复制多个人的程序时,由于这个“空壳”程序杂乱导致程序运行失败的情况(以前是真的多次出现这个情况,有时候真的不懂这个地方还会出问题。。。)

class Input(QtWidgets.QWidget, Ui_Dialog_1):def __init__(self):super(Input, self).__init__()self.setupUi(self)self.setWindowTitle("0~419.527℃")if __name__ == '__main__':app = QtWidgets.QApplication(sys.argv)win = Input()win.show()sys.exit(app.exec_())

3. 运行程序模板

和上文一样,这个模板也是供我今后再用PyQt5项目时使用:

class Input(QtWidgets.QWidget, Ui_Dialog_1):def __init__(self):super(Input, self).__init__()self.setupUi(self)self.setWindowTitle("0~419.527℃")self.init()...def init(self):self.pushButton_cal_1.clicked.connect(self.calculate1)....def calculate1(self):self.Zn1 = float(self.lineEdit_Zn1.text())...if __name__ == '__main__':app = QtWidgets.QApplication(sys.argv)win = Input()win.show()sys.exit(app.exec_())

4. lineEdit 输入提示写法:lineEdit.setPlaceholderText

有时候需要在lineEdit的输入框上显示提示,例如界面中显示的“请输入5位小数”,这时候运用的写法为lineEdit.setPlaceholderText(‘请输入5位小数’),显示效果如图所示:

5. float和str数据类型之间的那些事

因为之前没有怎么系统地学习过python语言,所有在项目中float小数类型和str字符串类型的转换没有很熟练,其中也查阅了许多的资料才搞明白。。。我把我学到的一直知识放进来吧。

  1. float数字类型和str字符串类型
  • Python3 支持 int、float、bool、complex(复数)(原谅我之前将数据类型写成double)
  • type() 函数可以用来查询变量所指的对象类型
  • float保留2位小数的方法为:
a = 5.026
float('%.2f' % a)
5.03
  • str() 函数将对象转化为字符串
self.lineEdit_Zn10.setText(str(self.Zn10))
  1. 项目中float类型与str类型的相互转换
    首先一点,我们要知道在PyQt5中,lineEdit控件输入的数据类型默认为str字符串类型,所以要将实验员输入的数据由str类型转化为float类型,才可进行运算。所以一开始,不难想到运用float函数将lineEdit输入的str变量转化为float类型,即:
self.Zn1 = float(self.lineEdit_Zn1.text())

那么之后呢,同理可得,如果要将计算出的float类型输出到lineEdit控件进行显示,就需要再将计算出的参数再转化为str类型,不难想出,一开始我采取的是这种形式:

self.lineEdit_Zn7.setText(str(self.Zn7))

那么问题出现了,由于等级标准的不同,每一类等级所需要保留的位数不同,这就导致了一个问题,str()函数输出的字符串如果是由小数转变而来,当小数后面存在需要保留位数的0的时候,str()转化过来会默认将小数后面的0给省去,这就很烦(明明我需要保留7位小数,即使后面有0也需要保留,但是str()转化过来我的小数后的0不见了◑﹏◐),如果我没有表达清楚的话可以运行下面的代码试试:

a = 1.980000
print(str(a))→1.98

问题来了就去解决嘛,于是我发现了解决方法:
格式化字符串常量f-string
我所用的格式也比较简单:f"{a:.2f}"

self.lineEdit_Zn13.setText(f"{self.Zn13:.7f}")

这个格式化字符串函数就很好地解决了float浮点型数据转变为str类型时,小数后面0默认省略的情况。

6. 下拉菜单comboBox的运用

下拉菜单comboBox这个玩意的运用也有几点要说的,我使用的时候就是用它来划分等级标准,每一种等级标准所对应的保留小数位数不同,样式如图所示:
首先要解决的就是用法,我运用的是self.comboBox.currentIndexChanged.connect转接到相应的函数,再在自定义函数中运用 if 条件语句来应对不同等级所对应的不同情况:

self.comboBox_grade.currentIndexChanged.connect(self.comboBoxGrade)def comboBoxGrade(self):self.Grade = self.comboBox_grade.currentText()if self.Grade == '工作基准':...elif self.Grade == '一等标准':....else:...

还有一点需要注意的就是因为对于不同的等级标准,后期点击按钮事件,参数计算保留的小数位数也不尽相同,所以项目中将点击确定按钮事件的点击函数(我不知道是不是这样叫的==)写在了 if 条件语句下,也就是:

def comboBoxGrade(self):self.Grade = self.comboBox_grade.currentText()if self.Grade == '工作基准':...self.pushButton_confrim.clicked.connect(self.calall1)elif self.Grade == '一等标准':....self.pushButton_confrim.clicked.connect(self.calall2)else:...self.pushButton_confrim.clicked.connect(self.calall3)

这是我能想到的办法了,因为想了好久这个问题,其实感觉也不难,但是就是在你身临其中的时候,这种逻辑关系就搞的好乱ヽ(≧□≦)ノ

7.全局变量 or 局部变量

关于全局变量和局部变量的定义是这样的:
全局变量和局部变量的区别在于作用域,全局变量在整个py文件中声明,全局范围内可以使用;局部变量是在某个函数内部声明的,只能在函数内部使用,如果超出使用范围(函数外部),则会报错。

def calculate1(self):self.Zn1 = float(self.lineEdit_Zn1.text())self.Zn2 = float(self.lineEdit_Zn2.text())
def calall1(self):self.Rtpall = (self.Zn1 + self.Zn2 + self.Zn1 + self.Zn2) / 4self.lineEdit_Rtpall.setText(f"{self.Rtpall:.5f}")

那么问题来了,为什么我在calculate1函数中定义的 self.Zn1 和 self.Zn2 为什么在calall1函数中也可以使用呢,而且程序没有报错并且也能正常执行运算?(・∀・(・∀・(・∀・*)或许有没有懂哥帮我解答一下,至少目前我还蒙蒙的=-=

8. QDateEdit的简单使用

使用PyQt5开发图形界面,里面使用日期框,这里把这个QDateEdit组件命名为:dateEdit_date

from PyQt5.QtCore import QDate

1.初始化赋值,不设置则默认为2000/1/1,这里默认为当天日期

self.dateEdit_date.setDate(QDate.currentDate())

2.读取选择后的日期

Date = self.dateEdit_date.date().toString(Qt.ISODate)

显示日期格式:yyyy-mm-dd

如:2019-07-30

self.dateEdit_date.setDate(QDate.currentDate())

9.最后一些不好总结但是确实我学到的一些小知识(想到再补充吧)

  • Python中的平方表示不是“^2”,而是“**2”(wdnmd w(゚Д゚)w)

- 目前设计的信息输入界面依旧存在的问题(等待维护)

1. 信息输入错误时,计算按钮点击闪退问题

就是当输入框的对应输入数据为空或者输入数据发生错误时(当时就是在试验的时候填入错误数据导致系统退出),这里的输入错误主要就是计算出当分母为0的情况下,系统也会退出

Process finished with exit code -1073740791 (0xC0000409)

后期还是要想想怎么去解决这个问题,毕竟不可能出现错误就退出,看看能不能运用Qmessage,在相应的输入错误情况时弹出对话框,我觉得这是一个good idea (✿◡‿◡)

2. 全局变量和局部变量

就前面说的,虽然说这个问题对于程序的执行和系统的运行没有什么影响,但是我还是想要弄懂这个问题,希望有人可以解答一下。

3. 一个控件对应两个函数的问题

就是有时候确实是有一个控件对应两个函数的情况,就比如我一开始程序是这样写的:

def init(self):self.comboBox_grade.currentIndexChanged.connect(self.calculate1)self.comboBox_grade.currentIndexChanged.connect(self.comboBoxGrade)

我也不知道可不可以这样的,当时程序是报错的,但不知道是不是这里的问题,到后来也没有解决,就采取了其他的逻辑好像 (∪.∪ )…zzz

4. 在 if 条件语句中定义函数

我记得当时我在程序中还这样写过:

def comboBoxGrade(self):self.Grade = self.comboBox_grade.currentText()if self.Grade == '工作基准':def calculate1(self):......

当时这样写,初始函数init()中的点击事件函数之间失效了

self.pushButton_cal_1.clicked.connect(self.calculate1)

也就是上面的代码直接变灰了,也就表示如果将calculate1函数定义在if 条件语句中,点击事件函数也就没用了,所以我不知道在PyQt5中,函数是否可以定义在if 条件语句中,如果可以的话,那么点击事件函数self.pushButton.clicked.connect(self.calculate1)应该写在哪里呢???

- 总结

现在是北京时间QDate.currentDate()(开个玩笑)凌晨1:24,这篇CSDN文章花了我半天时间(问就是下午打游戏去了=-=),挺开心的,今天(明天)写完了,可以安心去睡觉了。其实也没有什么意图,有人讨论是更好的,但是没人看的话我就自己留着看看吧,还是挺有意义的一件事,大家晚安 ( ̄o ̄) . z Z。。。

记录一次基于PyQt5的标准铂电阻温度计分度表制作界面设计相关推荐

  1. PyQt5桌面应用开发(4):界面设计

    本文目录 PyQt5桌面应用系列 前言 为什么又是需求分析? PyQt5的界面设计元素 界面设计元素分类 编译为Python代码使用 转换命令行 组合使用 继承使用方式 直接使用ui文件的方法 总结 ...

  2. 计算机网络技术放块队解说词,基于《计算机网络技术》课程多媒体课件制作与设计.doc...

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbsp通信/网络 基于<计算机网络技术>课程多媒体课件制作 ...

  3. 二参数威布尔分布matlab,基于MATLAB的威布尔分布参数估计的图形界面设计

    基于 MATLAB 的威布尔分布参数估计的图形界面设计 唐军军, 姜年朝, 宋军, 徐艳楠, 刘达 (总参第六十研究所, 江苏 南京 210016) 摘 要: 基于 MATLAB 平台, 设计了一款集 ...

  4. 无线抄表与服务器,基于Modbus协议的远程无线抄表系统的设计与实现

    摘要: 随着人民生活水平的日益提高,智能计量表在日常生活和工作中的使用越来越普及.但是传统人工抄表需要消耗大量的人力和物力,并且抄表人员需亲临现场或恶劣的环境,鉴于安全性和便捷性的考虑,远程智能抄表系 ...

  5. 基于C#的AE二次开发之主界面设计

    上篇文章介绍了AE的安装与配置,下面介绍在VS2012中AE的简单主界面设计方法. 一.项目创建 1.打开VS2012建立项目 在打开界面后,点击新建项目,在弹出的界面中选择Visual C#--Ar ...

  6. 基于Html+Bootstrap的高校智慧学习平台WEB界面设计

    目 录 1 概述 4 2 需求分析 4 3 高校智慧学习平台WEB界面设计 4 2.1 功能描述 5 2.2 功能结构图 5 2.3界面设计 7 1 概述 高校智慧学习平台主要是为在校学生提供一个开源 ...

  7. PyQt5桌面应用开发(10):界面布局基本支持

    本文目录 PyQt5桌面应用系列 布局 利器 游戏 总结 PyQt5桌面应用系列 PyQt5桌面应用开发(1):需求分析 PyQt5桌面应用开发(2):事件循环 PyQt5桌面应用开发(3):并行设计 ...

  8. 基于PyQt5的快速开发框架QFramer

    2019独角兽企业重金招聘Python工程师标准>>> QFramer 是基于PyQt5的一款快速开发框架 ####1. 基于Qt/ PyQt /PySide开发GUI常用的开发方式 ...

  9. 基于ASAM ODS标准的试验数字化平台-WDP

    一 现状 随着现代测控技术的提高,数据结构变得越来越复杂多样,测量的数据量也在日益增大.并且由于试验条件的限制,大多数企业的数据管理方式主要是通过各类电子文档将试验数据保存在每个工程师的移动电脑中,再 ...

最新文章

  1. 2021年诺贝尔经济学奖评述:解决重大社会问题的自然实验因果框架
  2. php留言板记录ip,如何用php程序记录来访IP
  3. 汉字转UNICODE?
  4. 西北大学计算机考试,西北大学计算机技术
  5. jdk并发包里常用的类
  6. [转]状态压缩dp(状压dp)
  7. MSSQLServer基础07(事务,存储过程,分页的存储过程,触发器)
  8. 基于ROS的运动识别
  9. android pak文件_Android 动态加载 (三) PAK 详解
  10. X86服务器及“机架、塔式、刀片”三类服务器分类
  11. 批处理版MPlayer播放器
  12. 单阶段和两阶段目标检测
  13. 阳春三月,激情飞扬,c/c++0313就业班开班啦!
  14. 国内主流云服务器价格概览
  15. Just Do IT. - 收藏集 - 掘金
  16. POJ 1273 Dinic
  17. matlab电路元件二极管,(强烈推荐)基于Matlab的电子线路的设计与仿真_毕业论文
  18. Ranking 排行
  19. VirtualBox安装虚拟机并为其装系统
  20. 预编译及预处理的理解

热门文章

  1. String[]数组初始化
  2. java bufferedread_java中关于bufferedreader类中read方法
  3. 通过Opencv打开指定摄像头的方法
  4. (附源码)springboot+mysql+采用协同过滤算法的视频推荐系统的设计与实现 毕业设计261620
  5. matlab tdoa aoa,基于改进最小二乘算法的TDOA/AOA定位方法.PDF
  6. 深入理解line-height和vertical-align
  7. vertical-align详解
  8. python脚本之批量查询网站权重2.0
  9. 报名系统网页导出html,【网页报名表如何导出pdf】_网页的报名表怎样转换为word或者PDF格式...
  10. ROS从入门到精通系列(十四)-- PR2机器人应用