二话不说先上效果图:

开发流程:

1、电压采集

使用某宝上电压采集模块,该模块支持RS485连接上位机;

根据采集模块Moubus通讯规则,使用python 编写获取电压值,上代码

# encoding: utf-8
'''
@author: halen.li
@contact: 1056008549@qq.com
@file: GET_V.py
@time: 2021/6/26 0026 8:05
@desc:
'''
import serial
import serial.tools.list_ports
import re
from time import sleep
import structdef GetCom():port_list=list(serial.tools.list_ports.comports())if len(port_list)==0:print("NO Find COM Port")else:for i in range(0,len(port_list)):matchport = re.match(r'(.*) - USB-SERIAL (.*?).*',str(port_list[i]),re.M|re.I)return (matchport.group(1))def OpenCom(portx):try:ser = serial.Serial(portx, 9600, timeout=1)if (ser.is_open):WritePort(ser)sleep(0.1)len_return_data = ser.inWaiting()if len_return_data:return_data = ser.read(len_return_data)str_return_data = str(return_data.hex())voltage_data = str_return_data[6:14]result = struct.unpack('!f', bytes.fromhex(voltage_data))[0]ser.close()return(round(result,3))ser.close()except Exception as e:print("Open com error:",e)
def WritePort(ser):data = '01 03 00 00 00 02 C4 0B'send_data = bytes.fromhex(data)ser.write(send_data)def GetVoltage():portx = GetCom()Vol = []while True:Vol_v = OpenCom(portx)if Vol_v != None and Vol_v > 0.1:Vol.append(Vol_v)if len(Vol) == 5:breakelse:breakreturn Vol

2、界面开发

使用QtDesigner设计界面

ui转py文件

# -*- coding: utf-8 -*-# Form implementation generated from reading ui file 'Volage.ui'
#
# Created by: PyQt5 UI code generator 5.15.2
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_Form(object):def setupUi(self, Form):Form.setObjectName("Form")Form.resize(967, 594)self.tableWidget = QtWidgets.QTableWidget(Form)self.tableWidget.setGeometry(QtCore.QRect(23, 52, 921, 511))#self.tableWidget.setRowCount(100)#self.tableWidget.setColumnCount(10)self.tableWidget.setObjectName("tableWidget")self.tableWidget.horizontalHeader().setVisible(False)self.tableWidget.horizontalHeader().setHighlightSections(False)self.pushButton = QtWidgets.QPushButton(Form)self.pushButton.setGeometry(QtCore.QRect(470, 20, 75, 23))self.pushButton.setObjectName("pushButton")self.pushButton_2 = QtWidgets.QPushButton(Form)self.pushButton_2.setGeometry(QtCore.QRect(350, 20, 75, 23))self.pushButton_2.setObjectName("pushButton_2")self.lineEdit = QtWidgets.QLineEdit(Form)self.lineEdit.setGeometry(QtCore.QRect(92, 22, 201, 20))self.lineEdit.setObjectName("lineEdit")self.label = QtWidgets.QLabel(Form)self.label.setGeometry(QtCore.QRect(26, 22, 60, 16))self.label.setObjectName("label")self.layoutWidget = QtWidgets.QWidget(Form)self.layoutWidget.setGeometry(QtCore.QRect(650, 20, 183, 22))self.layoutWidget.setObjectName("layoutWidget")self.formLayout = QtWidgets.QFormLayout(self.layoutWidget)self.formLayout.setContentsMargins(0, 0, 0, 0)self.formLayout.setObjectName("formLayout")self.label_2 = QtWidgets.QLabel(self.layoutWidget)self.label_2.setObjectName("label_2")self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label_2)self.lineEdit_2 = QtWidgets.QLineEdit(self.layoutWidget)self.lineEdit_2.setObjectName("lineEdit_2")self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.lineEdit_2)self.retranslateUi(Form)QtCore.QMetaObject.connectSlotsByName(Form)def retranslateUi(self, Form):_translate = QtCore.QCoreApplication.translateForm.setWindowTitle(_translate("Form", "电压测试记录"))self.pushButton.setText(_translate("Form", "保存"))self.pushButton_2.setText(_translate("Form", "打开"))self.label.setText(_translate("Form", "主板条码:"))self.label_2.setText(_translate("Form", "当前点位电压值:"))

界面逻辑处理

# encoding: utf-8
'''
@author: halen.li
@contact: 1056008549@qq.com
@file: MainUI.py
@time: 2021/9/11 0011 15:11
@desc:
'''
import sys, time
import win32api,win32con
from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QColor, QBrush
from openpyxl import load_workbook, Workbook
from Volage import Ui_Formclass MyMainForm(QMainWindow, Ui_Form):def __init__(self, parent=None):super(MyMainForm, self).__init__(parent)self.setupUi(self)"""按钮事件""""""打开按钮"""self.pushButton_2.clicked.connect(self.openExcel)"""保存按钮"""self.pushButton.clicked.connect(self.SaveToExcel)"""设置当前电压框为只读"""self.lineEdit_2.setReadOnly(True)"""设置软件启动时光标定位到扫条码框"""self.lineEdit.setFocus(True)def TableUI(self,path):"""表格显示""""""表格列宽自适应"""self.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)"""从外部表格获取表格属性,行数、列数、和单元格数据,设置为tableWidget表格的属性并显示在界面上"""self.tableWidget.set_row, self.tableWidget.set_column, self.tableWidget.set_Exceldata = self.ReadExcel(path)self.tableWidget.setRowCount(self.tableWidget.set_row)self.tableWidget.setColumnCount(self.tableWidget.set_column)for i in range(0, len(self.tableWidget.set_Exceldata)):for j in range(0, len(self.tableWidget.set_Exceldata[i])):print(str(self.tableWidget.set_Exceldata[i][j]))if str(self.tableWidget.set_Exceldata[i][j]) == str(None):self.tableWidget.setItem(i, j, QTableWidgetItem(""))else:self.tableWidget.setItem(i, j, QTableWidgetItem(str(self.tableWidget.set_Exceldata[i][j])))

程序入口

if __name__ == "__main__":defaultrow, defaultcol = 0, 0current_data = []result_temp = []app = QApplication(sys.argv)myWin = MyMainForm()update_data_thread = UpdateData()update_data_thread.update_date.connect(myWin.update_item_data)  # 链接信号update_data_thread.start()myWin.show()sys.exit(app.exec_())

实时界面刷新

class UpdateData(QThread):"""更新数据类"""update_date = pyqtSignal(str)  # pyqt5 支持python3的str,没有Qstringdef run(self):while True:a = []import GET_Va = GET_V.GetVoltage()if len(a) != 0:b = max(a)self.update_date.emit(str(b))  # 发射信号else:b = 0self.update_date.emit(str(b))  # 发射信号time.sleep(0.1)
    def update_item_data(self, data):"""更新内容"""global current_data, defaultrow, defaultcol, result_tempself.tableWidget.setCurrentCell(self.tableWidget.currentRow(), self.tableWidget.currentColumn())self.lineEdit_2.setText(str(data))self.MBSN = self.SN_SCAN()self.datetimenow = self.Gettime()if self.tableWidget.currentRow() > 0 and self.tableWidget.currentRow() < self.tableWidget.set_row and self.tableWidget.currentColumn() == 3:defaultrow = self.tableWidget.currentRow()defaultcol = self.tableWidget.currentColumn()self.tableWidget.setCurrentCell(defaultrow, defaultcol)if float(data) < 0.1:result_temp = []else:if float(data) > float(self.tableWidget.item(self.tableWidget.currentRow(), 1).text()) and float(data) < float(self.tableWidget.item(self.tableWidget.currentRow(), 2).text()):if len(result_temp) == 0:result_temp.append(data)self.tableWidget.setItem(self.tableWidget.currentRow(), self.tableWidget.currentColumn(), QTableWidgetItem(result_temp[0]))self.tableWidget.setItem(defaultrow, defaultcol + 1, QTableWidgetItem("PASS"))self.tableWidget.item(defaultrow, defaultcol + 1).setBackground(QBrush(QColor(0, 255, 0)))if defaultrow < self.tableWidget.set_row - 1:defaultrow = self.tableWidget.currentRow()defaultcol = self.tableWidget.currentColumn()defaultrow += 1self.tableWidget.setCurrentCell(defaultrow, defaultcol)else:defaultrow = self.tableWidget.currentRow()defaultcol = self.tableWidget.currentColumn()defaultrow = self.tableWidget.set_row - 1self.tableWidget.setCurrentCell(defaultrow, defaultcol)else:if len(result_temp) == 0:result_temp.append(data)self.tableWidget.setItem(self.tableWidget.currentRow(), self.tableWidget.currentColumn(), QTableWidgetItem(result_temp[0]))self.tableWidget.setItem(defaultrow, defaultcol + 1, QTableWidgetItem("FAIL"))self.tableWidget.item(defaultrow, defaultcol + 1).setBackground(QBrush(QColor(255, 0, 0)))if defaultrow < self.tableWidget.set_row - 1:defaultrow = self.tableWidget.currentRow()defaultcol = self.tableWidget.currentColumn()defaultrow += 1self.tableWidget.setCurrentCell(defaultrow, defaultcol)else:defaultrow = self.tableWidget.currentRow()defaultcol = self.tableWidget.currentColumn()defaultrow = self.tableWidget.set_row - 1self.tableWidget.setCurrentCell(defaultrow, defaultcol)else:defaultrow = self.tableWidget.currentRow()defaultcol = self.tableWidget.currentColumn()print("defaultrow:",defaultrow)print("defaultcol:",defaultcol)

按钮绑定事件

    def openExcel(self):try:openfile_name = QFileDialog.getOpenFileName(self, '选择文件')path_openfile_name = openfile_name[0]print(path_openfile_name)self.TableUI(path_openfile_name)except:print("Open Mode Excel Fail !")
    def SaveToExcel(self):"""把当前表格数据写入Excel并保存成Excel文档"""Wirtedata = self.GetSaveData()wb = Workbook()ws = wb.activefor r in range(len(Wirtedata)):for c in range(len(Wirtedata[r])):ws.cell(r+1, c+1).value = Wirtedata[r][c]#wb.save(self.MBSN+'-'+self.datetimenow+'.xlsx')SaveExcelName = self.MBSN+'-'+self.datetimenow+'.xlsx'wb.save("../DataFile/{}".format(SaveExcelName))self.MesageShow()

萌新菜鸟花了一阵子时间才把整个流程调顺,书到用时方恨少!!!至少编写的程序可用,很是欣慰

PYQT编写一个电压数据采集界面相关推荐

  1. 基于PYQT编写一个人脸识别软件(2)

    前言 以前在博客:基于PYQT编写一个人脸识别软件 中给出了我自己用PYQT编写的一个小软件.鉴于使用的是开源库--face_recogniton,尽管使用很简单,但是还有些问题,比如:识别黄种人时效 ...

  2. python打开交互界面设计_老司机必备——用PyQt做一个有交互界面的妹子图爬虫...

    内容简介:老司机必备--用PyQt做一个有交互界面的妹子图爬虫 代码飙车,指日可待.今天的课程教大家结合PyQt和 Python 爬虫技术,做一个带有交互界面的妹子图网站爬虫程序. 一.实验简介 1. ...

  3. 使用Java语言编写一个五子棋UI界面并实现网络对战功能(非局域网)

    使用Java语言编写一个五子棋UI界面并实现网络对战功能(非局域网) 一,前期准备 1,Java IDE(Eclipse)与JDK的安装与配置 jdk-15.0.1-免配置路径版 提取码:earu 免 ...

  4. 基于PYQT编写一个人脸识别软件

    转载请注明出处:http://blog.csdn.net/hongbin_xu 或 http://hongbin96.com/ 文章链接:http://blog.csdn.net/hongbin_xu ...

  5. 【QT上位机编写第三步】编写一个电压、电流显示串口上位机

    文章目录 一.上位机的信号和槽函数? 二.上位机软件编程 2.1.模块和类导入 2.1.首先是写串口初始化 2.1.串口读取 2.2.串口写入 2.3.清除数据框的内容 2.4.自动搜索串口端口号 三 ...

  6. 编写一个关于小型界面文件。

    首先遇到的是关于界面的问题,整体布局基本结束,可就是在RelativeLayout和linearLayout之间徘徊和争论. 因为按照预定的思维,使用RelativeLayout可以很好的完成整体的布 ...

  7. C#编写一个简易计算器

    C#编写一个简易计算器 界面 代码 using System; using System.Collections.Generic; using System.ComponentModel; using ...

  8. 教我如何使用python编写一个界面

    要使用 Python 编写一个界面,通常需要使用 GUI 库,如 Tkinter, PyQt, wxPython 等.这些库都提供了一系列的控件(如按钮.文本框.标签等)和方法,帮助您创建和设计图形界 ...

  9. 编写一个python程序、输出如下图形效果_Tkinter模块编写Python图形界面代码实例...

    本篇文章小编给大家分享一下Tkinter模块编写Python图形界面代码实例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 一.为何使用Tkinter ...

最新文章

  1. php 去掉数组相同元素,php怎么去掉数组中重复的元素
  2. Android应用程序更新并下载
  3. k8s项目(弹性云实战)
  4. NuGet在Push的时候提示“远程服务器返回错误:(403)已禁用”问题解决
  5. 换个角度看GAN:另一种损失函数
  6. 打印机怎么扫描到电脑_【柯美C360扫描怎么用教程】打印机怎么扫描
  7. 深入掌握JMS(七):DeliveryMode例子
  8. 去哪儿-10-city-ajax
  9. Seata-Server安装_以及工作原理---微服务升级_SpringCloud Alibaba工作笔记0058
  10. oracle 的变量的定义和赋值
  11. Internet校验和
  12. 如何将两张图片合成一张?
  13. 也评 阿里 P10 赵海平对王垠的面试
  14. redis中字符串(String)类型常见命令操作 (附有示例)
  15. 微信营销的技巧有哪些 微信营销取名的禁忌 微信内容写作的七个要点
  16. 提高网络安全性:探索ADAudit Plus的全功能IT安全审计解决方案
  17. 盗版网课有多猖狂?原价上万,只卖5元
  18. 有心栽花花不开,无心插柳柳成阴
  19. java做服务端,FLASH做客户端交互总结
  20. Linux磁盘与分区命名:sda, sdb, sdc, sda1, sda2

热门文章

  1. crmeb多商户系统前端uniapp取消用户短信验证登录教程
  2. 如何用P6软件编制项目进度计划(下)
  3. VVC帧间预测(二)Merge mode with MVD (MMVD)
  4. 安装新交互英语客户端提示找不到SOAP的解决方案
  5. 三种方式实现网页二级菜单
  6. java中虚数咋表示,虚数的定义(高中虚数i的运算公式举例)
  7. 数学简史:数学是一门非常重要的学科,它在各个领域都有着广泛的应用。从古代到现代,数学一直在不断发展和演变,为我们提供了无尽的智慧和启示。
  8. 生信数据库ID总结及转换方法
  9. RTKLIB专题学习(三)---矩阵应用
  10. python对象的基本概念