proteus仿真大赛-----pyqt5制作上位机安防页面

news/2024/10/22 15:39:10/

本项目是基于pyqt5进行上位机的开发,主要是向下位机发送控制指令以及向服务器发送信息

主页面如图所示:

 1.主页面是继承QMainWindow,使用QPushButton设置四个按钮,分别使用信号与槽机制连接不同的方法,然后使用setStyleSheet对按钮进行美化,分了两种类型,鼠标点击和鼠标划过

text_btn = QPushButton("注册", self)text_btn.setGeometry(100, 30, 200, 100)text_btn.clicked.connect(self.register_dialog)text_btn.setStyleSheet(''' QPushButton{text-align : center;        #文本框内容居中显示background-color : white;    #背景颜色:白色font: bold;                  #将字体加粗border-color: red;           #设置按钮边框颜色:红色border-width: 2px;           #边框宽度设置为2像素。border-radius: 20px;         #按钮的圆角半径设置为20像素,使其变成圆形或椭圆形padding: 6px;                #按钮的内部填充设置为6像素,以增加按钮与其内容之间的间距height : 14px;               #按钮的高度设置为14像素border-style: outset;font : 25px;}QPushButton:pressed{text-align : center;background-color : light gray;font: bold;border-color: gray;border-width: 2px;border-radius: 10px;padding: 6px;height : 14px;border-style: outset;font : 25px;}''')self.switch_btn1 = QPushButton("关闭安防", self)self.switch_btn1.setFont(QFont('Arial', 15))self.switch_btn1.setGeometry(450, 200, 200, 100)# switch_btn1.clicked.connect(self.switch1)self.switch_btn1.setStyleSheet(''' QPushButton{text-align : center;background-color : white;font: bold;border-color: red;border-width: 2px;border-radius: 20px;padding: 6px;height : 14px;border-style: outset;font : 25px;}QPushButton:pressed{text-align : center;background-color : light gray;font: bold;border-color: gray;border-width: 2px;border-radius: 10px;padding: 6px;height : 14px;border-style: outset;font : 25px;}''')self.switch_btn2 = QPushButton("打开安防", self)self.switch_btn2.setFont(QFont('Arial', 15))self.switch_btn2.setGeometry(450, 30, 200, 100)# switch_btn2.clicked.connect(self.switch2)self.switch_btn2.setStyleSheet(''' QPushButton{text-align : center;background-color : white;font: bold;border-color: red;border-width: 2px;border-radius: 20px;padding: 6px;height : 14px;border-style: outset;font : 25px;}QPushButton:pressed{text-align : center;background-color : light gray;font: bold;border-color: gray;border-width: 2px;border-radius: 10px;padding: 6px;height : 14px;border-style: outset;font : 25px;}''')self.switch_btn3 = QPushButton("房屋数据", self)self.switch_btn3.setFont(QFont('Arial', 15))self.switch_btn3.setGeometry(100, 200, 200, 100)# switch_btn3.clicked.connect(self.tempurate_dialog)self.switch_btn3.setStyleSheet(''' QPushButton{text-align : center;background-color : white;font: bold;border-color: red;border-width: 2px;border-radius: 20px;padding: 6px;height : 14px;border-style: outset;font : 25px;}QPushButton:pressed{text-align : center;background-color : light gray;font: bold;border-color: gray;border-width: 2px;border-radius: 10px;padding: 6px;height : 14px;border-style: outset;font : 25px;}''')

2.注册页面主要打开一个继承QDialog,使用标签和文本框,进行有效信息的输入,然后点击确定按钮,进入到槽函数,槽函数中分别读取三个文本框的内容,然后转换为统一格式发送给下位机,同时将信息发送给服务器

#注册窗口代码self.setWindowTitle("注册页面")self.resize(500, 400)self.setWindowModality(Qt.ApplicationModal)self.formlayout = QFormLayout()font = QFont()font.setPointSize(12)self.label1 = QLabel("设备ID:")self.lineEdit1 = QLineEdit()self.label2 = QLabel("用户姓名:")self.lineEdit2 = QLineEdit()self.label3 = QLabel("手机号:")self.lineEdit3 = QLineEdit()self.label1.setFont(font)self.label2.setFont(font)self.label3.setFont(font)self.label1.setFixedSize(100, 50)self.label2.setFixedSize(100, 50)self.label3.setFixedSize(100, 50)self.lineEdit1.setFixedSize(400, 50)self.lineEdit2.setFixedSize(400, 50)self.lineEdit3.setFixedSize(400, 50)self.lineEdit1.setFont(font)self.lineEdit2.setFont(font)self.lineEdit3.setFont(font)self.lineEdit1.setStyleSheet("""QLineEdit {border: 2px solid blue;               border-radius: 5px;padding: 5px;background-color: #ffffff;color: #333333;}QLineEdit:focus {border-color: #00aaff;outline: none;}""")self.lineEdit2.setStyleSheet("""QLineEdit {border: 2px solid green;border-radius: 5px;padding: 5px;background-color: #ffffff;color: #333333;}QLineEdit:focus {border-color: #00aaff;outline: none;}""")self.lineEdit3.setStyleSheet("""QLineEdit {border: 2px solid Purple;border-radius: 5px;padding: 5px;background-color: #ffffff;color: #333333;}QLineEdit:focus {border-color: #00aaff;outline: none;}""")self.formlayout.addRow(self.label1, self.lineEdit1)self.formlayout.addRow(self.label2, self.lineEdit2)self.formlayout.addRow(self.label3, self.lineEdit3)self.setLayout(self.formlayout)self.signIn = QPushButton('确认')self.signIn.setStyleSheet(''' QPushButton{text-align : center;background-color : white;font: bold;border-color: green;border-width: 2px;border-radius: 20px;padding: 6px;height : 14px;border-style: outset;font : 25px;}QPushButton:pressed{text-align : center;background-color : light gray;font: bold;border-color: gray;border-width: 2px;border-radius: 10px;padding: 6px;height : 14px;border-style: outset;font : 25px;}''')self.signIn.setFixedSize(500,50)self.signIn.setFont(font)self.formlayout.addRow(self.signIn)self.signIn.clicked.connect(self.sendRegisterRequest)self.exec_()

再打开一个子线程用于串口信息的发送【在之前也尝试过在槽函数中直接进行发送信息,但程序会直接卡死】,同时我在注册页面还加入了一个信号,必须是完成注册后于,其他三个功能才可以使用

#槽函数代码        self.signal.emit("yes")                  #发送信息给主窗口,点击了确认按钮user_id = self.lineEdit1.text()user_name = self.lineEdit2.text()user_number = self.lineEdit3.text()user_final_number = '+86' + user_numberdata = {'ID': user_id, "name": str(user_name), 'phone': user_final_number}message = json.dumps(data) + '\r\n'requests.post('http://47.109.149.102:5050/register', data=data)# 创建子线程self.serial_thread = SerialThread(message)self.serial_thread.data_signal.connect(self.handle_data)# 启动子线程self.serial_thread.start()

 

3.然后就是打开安防和关闭安防,两者作用就是给串口发送标志信息,让下位机进行对应的处理,关闭安防,可以设置关闭来设置安防的时间

4.房屋数据:主要使用来实时显示当前房屋内温度和烟雾浓度的实时信息,进行实时更迭,设定一个类,继承QMainWindow,大致的流程就是,在类内设定两个方法分别去处理从串口读取的温度和烟雾浓度的数据,然后进行绘图,因为读取串口的信息类似于键值对的形式,所以需要进行处理

 data = data.strip().replace(' ', '').replace('\r', '').split('\n')print(data)self.data_label.setText('Time:' + str(datetime.datetime.now()) + ', ' +data[0] + ', ' + data[1])self.t.append(time.time())self.temp.append(float(data[0].split(':')[1].strip()))self.pot.append(float(data[1].split(':')[1].strip()))

 然后将数据放入到signal中,通过信号传递给主线程【房屋数据窗口】

            signal = (self.t, (self.temp, self.pot))self.newdata.emit(signal)

图片:


http://www.ppmy.cn/news/1152019.html

相关文章

猫眼 校园招聘_1面

(1)打包和构建工具 vite 和 webpack 功能 1. 构建原理: Webpack 是一个静态模块打包器,通过对项目中的JavaScript、css、Image 等文件进行分析,生成对应的静态资源,并且通过一些插件和加载器来实现各种功…

什么是promise?如何使用?应用场景?

什么是Promise? Promise是一种用于处理异步操作的JavaScript编程模式。它允许你更优雅地处理异步代码,避免了回调地狱(Callback Hell)的问题,使代码更易于理解和维护。Promise是ES6(ECMAScript 2015&#…

11. SpringBoot项目中参数获取与响应

SpringBoot项目中参数获取与响应 1. 程序结构&通信方式 程序结构: C/S : 客户端/服务器端 -Main方法。 -效果炫目、数据相对安全。 -公司成本高,因为要分别开发客户端和服务器端。 B/S: 浏览器端/服务器端 -效果依赖于浏览…

vue防抖函数封装与使用

封装 debounce.js /*** 防抖函数* param {*} fn 函数* param {*} delay 暂停时间* returns */ export function debounce(fn, delay 500) {let timer nullreturn function () {const args argumentsif (timer) {clearTimeout(timer)}timer setTimeout(() > {fn.apply(…

【使用教程】在Ubuntu下PMM60系列一体化伺服电机通过SDO跑循环同步位置模式详解

本教程将指导您在Ubuntu操作系统下使用SDO(Service Data Object)来配置和控制PMM60系列一体化伺服电机以实现循环同步位置模式。我们将介绍必要的步骤和命令,以确保您能够成功地配置和控制PMM系列一体化伺服电机。 01.准备工作 在正式介绍之…

Kotlin笔记(一):Lambda,非空判断,函数默认参数

1. Lambda表达式 Lambda就是一小段可以作为参数传递的代码,在kotlin中的标准形式为: {参数名1: 参数类型, 参数名2: 参数类型 -> 函数体}标准形式使用如下: val list listOf("Apple", "Banana", "Orange", "Pear", "Grape&…

华为云云耀云服务器L实例评测|华为云耀云服务器L实例私有库搭建verdaccio(八)

九、华为云耀云服务器L实例私有库搭建verdaccio: Verdaccio 是一个简单的、零配置本地私有 npm 软件包代理注册表。Verdaccio 开箱即用,拥有自己的小型数据库,能够代理其它注册表(例如 npmjs.org),缓存下载…

spring:详解spring boot

spring的优缺点 虽然Spring的组件代码是轻量级的,但它的配置却是重量级的。一开始,Spring用XML配置,而且是很多XML配 置。Spring 2.5引入了基于注解的组件扫描,这消除了大量针对应用程序自身组件的显式XML配置。Spring 3.0引入 了…