我用PYQT5做的第一个实用的上位机项目(三)

news2024/11/23 3:14:53

基本的程序框架:

因为自己不是专业的程序员,只是一个搞电气控制的“票友”,所以尽量减少手动输入 代码量,能在Qt Dsigner里面完成的组态就不要放在代码里面完成。

在框架的建设方面,尽量做到集中和整合,位于同一画面的部件就集中在一个地方,方便中途增加和删除部件。所有的元素,可以做到“望文知义”,通过代码的组织结构能够迅速找到每一个部件的特征和动作。

如图所示,目前阶段的框架,包含了以下:

        公共函数,里面定义了一些通用的特征,比如常规型号的按钮、指示灯。

        画面的类,目前创建了两个画面:form0( 主画面)和form_setting(设定值画面),每一个画面对应一个同名首字母大写的类,例如:form0对应的类是Form0,form_setting对应的类是Form_setting。然后在类里面,每一个需要有操作的部件,例如按钮、指示灯等,也都对应一个同名首字母大写的类,这样就可以把所有部件的操作按位置集中整合。

        以设定值画面为例,共有三个部件需要操作:btn_OK,btn_cancel,label_setting

 所以在Form_setting的函数定义里,有三个对应的子类:

 Btn_OK,Btn_cancel,Label_setting,每个部件的定义和信号连接等都位于相应的类里面:

完整代码:

from sys import exit, argv
from PyQt5.QtCore import Qt, QCoreApplication, pyqtSignal
from PyQt5.QtWidgets import QApplication
from PyQt5 import uic
import buttons  # 按钮的内嵌图片资源


############################################
# 公共的函数
class PublicFunction:  # 公共函数
    @staticmethod
    def normal_button_init(button):  # 通常规格按钮的初始化
        button.isEntered = False  # 鼠标焦点是否在内
        button.setImage()  # 获取按钮上的图片
        button.style_normal = f'background-color:#4b5075;border-radius:8px;border:2px solid  rgb(43, 78, 140);color:#e6e6e6;image:{button.image};'  # 常态style
        button.style_enter = f'background-color:#4b5075;border-radius:8px;border:3px solid  #e6e6e6;color:#e6e6e6;image:{button.image};'  # 鼠标悬停后的style
        button.style_clicked = f'background-color:#4b5075;border:2px solid  #039806;border-radius:8px;color:#e6e6e6;image:{button.image};'  # 鼠标点击后的style
        button.style_on = f'background-color:#039806;border:4px solid  #e6e6e6;border-radius:8px;color:#e6e6e6;image:{button.image};'  # ON状态的style
        button.style_disable = f'background-color:#767676;border:2px solid  rgb(43, 78, 140);border-radius:8px;color:#c6c6c6;image:{button.image};'  # 禁用状态下的style

    @staticmethod
    def green_lamp_init(lamp):  # 绿色指示灯
        lamp.rad = str(round(lamp.width() / 2))
        lamp.off_color = '#767676'  # 默认off颜色
        lamp.on_color = '#039806'  # 默认on颜色

    @staticmethod
    def red_lamp_init(lamp):  # 红色指示灯
        lamp.rad = str(round(lamp.width() / 2))
        lamp.off_color = '#767676'  # 默认off颜色
        lamp.on_color = '#da1c1c'  # 默认on颜色

    @staticmethod
    def normal_label_init(label):  # 通常标签的初始化
        label.isEntered = False  # 鼠标焦点是否在内
        label.style_normal = 'background-color:#000d47;border:2px solid #4b5075;border-radius:8px;color:#f3da83;'  # 常态style
        label.style_enter = 'background-color:#4b5075;border-radius:8px;border:3px solid  #e6e6e6;color:#e6e6e6;'  # 鼠标悬停后的style
        label.style_clicked = 'background-color:#4b5075;border:2px solid  #039806;border-radius:8px;color:#e6e6e6;'  # 鼠标点击后的style


############################################
# 画面的类,每个画面对应一个同名的首字母大写的类
class Form0:  # 画面form0的类(form0是主窗口)
    def __init__(self):
        self.items = [form0.btn_exit, form0.btn_setting, form0.btn_user, form0.btn_history,
                      form0.lamp_working_1, form0.label_setting_1]  # form0的所有部件
        self.Classes = [self.Btn_exit(), self.Btn_setting(), self.Btn_user(), self.Btn_history(),
                        self.Lamp_working_1(), self.Label_setting_1()]  # self的所有部件的类

        form0.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint)  # 关掉边框,始终最前
        form0.menuBar().setVisible(False)  # 关闭顶部菜单栏
        form0.statusBar().setVisible(False)  # 关闭底部状态栏

        form0.show()  # 主画面显示

    # 画面中的部件的类,每个部件对应一个同名的首字母大写的类
    class Btn_exit:  # “退出系统”按钮对应的类

        def __init__(self):
            PublicFunction.normal_button_init(form0.btn_exit)  # 引用通常规格按钮的初始化
            form0.btn_exit.Clicked.connect(self.clicked)

        def clicked(self):  # “退出系统”按钮点击后的操作
            for f in forms:  # 关闭所有窗口
                f.close()

    class Btn_setting:  # “参数设置”按钮对应的类

        def __init__(self):
            PublicFunction.normal_button_init(form0.btn_setting)  # 引用通常规格按钮的初始化

    class Btn_user:  # “用户管理”按钮对应的类

        def __init__(self):
            PublicFunction.normal_button_init(form0.btn_user)  # 引用通常规格按钮的初始化

    class Btn_history:  # “历史数据”按钮对应的类

        def __init__(self):
            PublicFunction.normal_button_init(form0.btn_history)  # 引用通常规格按钮的初始化

    class Lamp_working_1:  # “工作指示1”指示灯对应的类

        def __init__(self):
            PublicFunction.green_lamp_init(form0.lamp_working_1)  # 初始化为绿色指示灯
            form0.lamp_working_1.color_on_bool(True)  # 初始化为on状态

    class Label_setting_1:  # “设置流量”标签对应的类

        def __init__(self):
            PublicFunction.normal_label_init(form0.label_setting_1)  # 引用通常规格标签的初始化

            form0.label_setting_1.DoubleClicked.connect(self.double_clicked)

        def double_clicked(self):
            form_setting.move(form0.label_setting_1.pos())  # 将数据设置画面移动至标签所在位置
            form_setting.label_setting.setText(form0.label_setting_1.text())  # 将标签内容显示在设置画面的设置标签内
            form_setting.show()  # 显示设置画面
            Form_setting.Btn_OK.todo = self.todo1  # 定义数据设置画面“确定”按钮按下后执行的函数

        def todo1(self):  # 定义数据设置画面“确定”按钮按下后执行的函数
            form0.label_setting_1.setText(form_setting.label_setting.text())


class Form_setting:  # 画面form_setting的类(form_setting是共用的数据设置窗口)

    def __init__(self):  # 画面form_setting的类的初始化

        form_setting.setWindowFlags(Qt.WindowStaysOnTopHint)  # 始终最前

        self.items = [form_setting.btn_OK, form_setting.btn_cancel,
                      form_setting.label_setting]  # Form_setting的所有部件
        self.Classes = [self.Btn_OK(), self.Btn_cancel(),
                        self.Label_setting()]  # Form_setting的所有部件的类

    class Btn_OK:  # “确定”按钮的类
        todo = None  # 这是一个共用的画面,todo是本画面确定键按下后将要执行的函数
        args = []  # todo函数的参数

        def __init__(self):
            PublicFunction.normal_button_init(form_setting.btn_OK)  # 引用通常规格按钮的初始化

            form_setting.btn_OK.Clicked.connect(self.clicked)
            form_setting.btn_OK.Clicked.connect(form_setting.close)

        def clicked(self):
            self.todo(*self.args)  # 点击OK后执行预置的函数

    class Btn_cancel:  # “取消”按钮的类

        def __init__(self):
            PublicFunction.normal_button_init(form_setting.btn_cancel)  # 引用通常规格按钮的初始化

            form_setting.btn_cancel.Clicked.connect(form_setting.close)

    class Label_setting:  # “设定值”标签的类

        def __init__(self):
            PublicFunction.normal_label_init(form_setting.label_setting)  # 引用通常规格标签的初始化


############################################
# 主函数
if __name__ == '__main__':
    app = QApplication(argv)
    QCoreApplication.setAttribute(Qt.AA_EnableHighDpiScaling)  # 解决显示比例不同时的部件变形问题

    forms = []  # 所有画面显示界面的集合

    form0 = uic.loadUi('../UIS/form0.ui')  # 生成并加载画面,form0是主画面
    forms.append(form0)  # 将画面加入集合
    Form0 = Form0()  # form0对应的类是Form0,将类Form0实体化

    form_setting = uic.loadUi('../UIS/设定值.ui')
    forms.append(form_setting)
    Form_setting = Form_setting()

    exit(app.exec_())

 运行截图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1057570.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构之双链表

双链表 1.复杂方法的图分析2.My_LinkedList代码3.接口MY_lIST4.测试类 1.复杂方法的图分析 2.My_LinkedList代码 package My_liNKEDlIST;public class My_LinkedList implements MY_lIST{static class ListNode{public int val;public ListNode prev;public ListNode next;pub…

数据结构 - 线段树的运用

数据结构 - 线段树的运用 前言一. 线段树的运用1.1 区间和 - 线段树节点的成员变量1.2 线段树的构建1.3 线段树的区间和查询1.4 线段树的区间和更新1.5 完整代码 二. 线段树的动态扩建2.1 向下递推2.2 向上递推2.3 更新操作2.4 查询操作2.5 完整代码 三. 线段树的使用案例3.1 定…

c++学习之优先级队列

目录 1.初识优先级队列 库中的实现 使用优先级队列 2.优先级队列的实现 3.仿函数 利用仿函数实现的优先级队列 迭代器区间构造(建堆) 1.初识优先级队列 如果我们给每个元素都分配一个数字来标记其优先级,不妨设较小的数字具有较…

2023年中国新能源汽车电动助力转向系统行业现状分析:随着新能源汽车的发展,产品渗透率的提升[图]

电动助力转向(EPS)系统是传统转向系统(如液压和电动液压系统)的替代品。自动驾驶汽车的日益普及正在推动全球电动助力转向系统市场的需求增长。配备电动助力转向系统的车辆总重量趋于减轻,从而进一步提高燃油效率,其中2022年中国新…

Nginx之Openresty基本使用解读

目录 Openresty基本介绍 Openresty源码编译安装 Openresty基本使用 测试lua脚本 外部分文件导入 关闭缓存,开启热部署 用lua代码获取系统变量 Openresty基本介绍 OpenResty是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua…

2023年中国纯棉纱行业现状及发展前景分析[图]

棉纱是棉纤维经纺纱工艺加工而成的纱,经合股加工后称为棉线。根据纺纱的不同工艺,可分为普梳纱和精梳纱。精梳纱选用优质原料,成纱中纤维伸直平行、结杂少、光泽好、条干匀、强力高,这类棉纱多用于织造高档。 棉纱分类 资料来源&…

2023年中国汽车座舱行业发展现状及趋势分析:高级人机交互(HMI)系统将逐步提升[图]

2022年有22.3%的汽车用户认为座舱内车载娱乐功能成为影响使用体验的关键因素。当前智能电动汽车的用户画像与娱乐、游戏等应用的用户画像相似,均以年轻人作为目标用户。年轻化的用户将娱乐功能的使用习惯延伸至汽车座舱内,对于座舱功能的需求不再局限于导…

【C语言】宏定义

🚩 WRITE IN FRONT🚩 🔎 介绍:"謓泽"正在路上朝着"攻城狮"方向"前进四"🔎🏅 荣誉:2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评百大博…

RFID藏品管理系统-智慧文物仓库管理系统

一、项目背景 RFID藏品管理系统DW-S407是一套成熟系统,依托互3D技术、云计算、大数据、RFID技术、智能传感器、AI、视频分析技术对文物仓库进行统一管理、分析的信息化、智能化、规范化的系统。 不管是博物馆还是艺术馆,藏品的管理都是非常复杂的。特…

使用Docker部署ElasticSearch7+ELK(附带ES操作操作命令集)

ElasticSearch 7ELK 程序安装Docker安装下载ES镜像提前创建挂载文件夹添加配置文件创建并启动容器可能出现的异常安装IK分词使用ElasticHD客户端工具(目前使用发现无法做增删改)安装Kibana 软件包安装安装ElasticSearch(需要JDK1.8)安装IK(下…

【高阶数据结构】哈希(哈希表、哈希桶)

⭐博客主页:️CS semi主页 ⭐欢迎关注:点赞收藏留言 ⭐系列专栏:C进阶 ⭐代码仓库:C进阶 家人们更新不易,你们的点赞和关注对我而言十分重要,友友们麻烦多多点赞+关注,你们的支持是我…

Codeforces Round 901 (Div. 2)

Problem - A - Codeforces 贪心 每次都先让b减到1&#xff0c;然后再去选择工具来增加时间 AC代码: #include<bits/stdc.h> #define endl \n #define int long long using namespace std; const int N110; int x[N]; int a,b,n; void solve() {cin>>a>>b…

【C语言】模拟实现strlen

strlen是非常常用的字符串函数 目录 介绍&#xff1a;模拟实现&#xff1a;计数器递归指针-指针 介绍&#xff1a; 我们可得这个函数是求在字符串开始与\0之间的字符串长度 代码示例&#xff1a; #include <stdio.h> int main() {const char* str1 "abcdef"…

神器 CodeWhisperer

这两天看到了好多关于 Amazon CodeWhisperer 针对个人用户终身免费使用的消息&#xff0c;便抽空简单来重点介绍下如何在 VS Code 这款 IDE 上安装和使用 CodeWhisperer。 亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视…

Linux——进程间通信——system V系列

✅<1>主页&#xff1a;&#xff1a;我的代码爱吃辣 &#x1f4c3;<2>知识讲解&#xff1a;Linux——进程间通信——system V系列 ☂️<3>开发环境&#xff1a;Centos7 &#x1f4ac;<4>前言&#xff1a;system V 版本进程间通信的机制。 目录 一.共享…

WebGPU 入门:绘制一个三角形

大家好&#xff0c;我是前端西瓜哥。 今天我们来入门 WebGPU&#xff0c;来写一个图形版本的 Hello World&#xff0c;即绘制一个三角形。 WebGPU 是什么&#xff1f; WebGPU 是一个正在开发中的潜在 Web 标准和 JavaScript API&#xff0c;目标是提供 “现代化的 3D 图形和计…

AutoCAD 产品设计:图形单位

本文讲解 AutoCAD 产品的图形单位功能产品设计&#xff0c;没有任何代码实现。 使用的 AutoCAD 为 2020 版本 图形单位是什么&#xff1f; 图形单位是用于设置 一些属性数据应该用什么格式显示 的命令&#xff0c;命令标识为 un&#xff08;units&#xff09;。 举个例子。 …

操作EXCEL计算3万条数据的NDVI并填入

Python操作EXCEL&#xff0c;计算3万条数据的NDVI并填入 问题描述 现在是有构建好了的查找表&#xff0c;不过构建了3万条数据&#xff0c;在excel中手动计算每行的NDVI值太麻烦了&#xff0c;也不会操作。 就试试python吧&#xff0c;毕竟python自动处理大型EXCEL数据很方便…

黑马头条项目环境搭建

注册中心网关配置 spring:cloud:gateway:globalcors:add-to-simple-url-handler-mapping: truecorsConfigurations:[/**]:allowedHeaders: "*"allowedOrigins: "*"allowedMethods:- GET- POST- DELETE- PUT- OPTIONroutes:# 平台管理- id: useruri: lb://…

51单片机可调幅度频率波形信号发生器( proteus仿真+程序+原理图+报告+讲解视频)

51单片机可调幅度频率信号发生器( proteus仿真程序原理图报告讲解视频&#xff09; 讲解视频1.主要功能&#xff1a;2.仿真3. 程序代码4. 原理图4. 设计报告5. 设计资料内容清单&&下载链接***[资料下载链接](https://docs.qq.com/doc/DS1daV1BKRXZMeE9u)*** 51单片机可…