当前位置: 首页 > article >正文

python3GUI--大屏可视化-XX产业大数据指挥舱(附下载地址) By:PyQt5

文章目录

  • 一.前言
  • 二.预览
  • 三.软件开发心得
    • 1.使用方法
    • 2.UI设计
    • 3.代码架构
    • 4.项目结构
  • 四.代码片段分享
    • 1.图片平滑缩放组件
    • 2.滚动日志组件
  • 五.心得体会


大小:35.0 M,软件安装包放在了这里!
本软件未使用web相关技术,无嵌套浏览器!

一.前言

今天又来和大家分享我开发的PyQt5大屏可视化方案了,本次和大家分享一款XX产业大数据指挥舱可视化方案。

二.预览

下面我将截图展示一下本次系统的主要功能
本次软件只有一屏,下面截图为软件主界面
在这里插入图片描述

三.软件开发心得

1.使用方法

双击安装包,点下一步进行安装,双击打开软件即可进入软件主界面,软件默认是全屏的,大家可以按下ESC退出。

在这里插入图片描述

2.UI设计

本次UI采用图片+文字的方式,软件整体布局为垂直布局,内部为水平布局,通过将主体内容占比增大的方式凸出主体内容,通过绘制组件实现了组件的重写,主屏增加了盘旋的无人机,增加了软件的灵巧性,软件内部有多个模块:病虫害预警、统计数据、硬件设备、灌溉数据、日志模块…每一部分都是单独设计的,简而言之就是每个模块都可以单独调试,避免了整体测试的时间浪费。软件整体颜色采用深色背景、亮色文字的方案,更直观地凸出主体。本次软件实现为代码实现,无设计师,请读者不要和笔者询问.ui文件。

3.代码架构

源代码文件夹包含多个.py文件,每个文件的互相调用逻辑见下图

在这里插入图片描述

4.项目结构

以下为本项目的代码结构,主要源代码在src目录下,目录下分资源、配置、组件包。
在这里插入图片描述

四.代码片段分享

1.图片平滑缩放组件

软开主屏中的“太阳”就是这个组件实现的

class ImageResizerLabel(QLabel):
	def __init__(self, parent=None):
		super().__init__(parent)

		# Initialize scaling factors and original image
		self.original_pixmap = None

		# Set the fixed minimum size of the label (75x75)
		self.min_size = 75
		self.max_size = 90

		# Set up a timer for smooth scaling effect
		self.timer = QTimer(self)
		self.timer.timeout.connect(self.resize_image)
		self.timer.start(30)  # 30ms interval for smooth transition

		# Initial fixed size for the label (75x75)
		self.setFixedSize(self.min_size, self.min_size)

		# Initialize scale factor and flag
		self.current_size = self.min_size
		self.scaling_up = True

	def load_image(self, image_path):
		"""Load an image into the label"""
		self.original_pixmap = QPixmap(image_path)
		if self.original_pixmap:
			self.update_image_size()  # Ensure image is resized to fit label size

	def update_image(self, image_path):
		"""Update the image data (called externally to update the image)"""
		if self.original_pixmap:
			self.original_pixmap = QPixmap(image_path)
			self.current_size = self.min_size  # Reset to the minimum size
			self.scaling_up = True  # Start scaling up again
			self.update_image_size()  # Update the image size after the update

	def resize_image(self):
		"""Resize the image smoothly"""
		if self.original_pixmap:
			if self.scaling_up:
				self.current_size += 0.5  # Increase size gradually (0.5 units per step)
				if self.current_size >= self.max_size:  # Reached the max size (100)
					self.scaling_up = False  # Start scaling down
			else:
				self.current_size -= 0.5  # Decrease size gradually (0.5 units per step)
				if self.current_size <= self.min_size:  # Back to the original size (75)
					self.scaling_up = True  # Start scaling up

			# Adjust the label size to match the current size
			self.setFixedSize(self.current_size, self.current_size)

			# Scale the image to fit the label size
			scaled_pixmap = self.original_pixmap.scaled(
				self.current_size, self.current_size, Qt.KeepAspectRatio, Qt.SmoothTransformation
			)

			# Update the pixmap
			self.setPixmap(scaled_pixmap)

	def update_image_size(self):
		"""Update the size of the label based on the image size"""
		if self.original_pixmap:
			# Adjust the size of the image while maintaining aspect ratio
			scaled_pixmap = self.original_pixmap.scaled(
				self.current_size, self.current_size, Qt.KeepAspectRatio, Qt.SmoothTransformation
			)
			self.setPixmap(scaled_pixmap)

	def resizeEvent(self, event):
		"""Handle window resize events to resize the image proportionally"""
		self.update_image_size()  # Update the image size whenever the widget is resized
		super().resizeEvent(event)  # Call the base class method to handle the default behavior

2.滚动日志组件

这个组件用于滚动显示日志

class ScrollingMessageWidget(QWidget):
	def __init__(self, parent=None, messages=[]):
		super().__init__(parent)
		self.messages = messages  # 初始化中奖信息列表
		self.message_labels = []  # 保存所有 QLabel
		self.current_offset = 0  # 当前滚动偏移量
		self.init_ui()
		self.start_scrolling()

	def init_ui(self):
		"""初始化UI组件"""
		# 窗口设置
		self.setStyleSheet("background-color: transparent;")

		# 垂直布局
		self.layout = QVBoxLayout(self)
		self.layout.setSpacing(0)
		self.layout.setContentsMargins(0, 0, 0, 0)

		# 设置字体样式
		font = QFont("Arial", 7, QFont.Bold)
		font.setBold(True)

		# 创建 QLabel 并添加到布局中
		self.create_labels(font)

	def create_labels(self, font):
		"""根据当前消息列表创建 QLabel"""
		# 清空原有标签
		for label in self.message_labels:
			self.layout.removeWidget(label)
			label.deleteLater()
		self.message_labels.clear()

		# 创建新的标签
		for message in self.messages:
			label = QLabel(message, self)
			label.setAlignment(Qt.AlignCenter)
			label.setFont(font)
			label.setStyleSheet("color: rgb(201,206,211);")
			self.layout.addWidget(label)
			self.message_labels.append(label)

		# 首尾相接:复制消息以实现循环效果
		for message in self.messages:
			label = QLabel(message, self)
			label.setAlignment(Qt.AlignCenter)
			label.setFont(font)
			label.setStyleSheet("color: rgb(201,206,211);")
			self.layout.addWidget(label)
			self.message_labels.append(label)

	def start_scrolling(self):
		"""启动滚动定时器"""
		self.timer = QTimer(self)
		self.timer.timeout.connect(self.scroll)
		self.timer.start(10)  # 每 5 毫秒更新一次

	def scroll(self):
		"""滚动消息"""
		# 滚动偏移量递增
		self.current_offset += 1

		# 检查是否需要重置偏移量
		if self.current_offset >= self.message_labels[0].height():
			self.current_offset = 0
			# 将第一个 QLabel 移动到最后
			label = self.message_labels.pop(0)
			self.layout.removeWidget(label)
			self.layout.addWidget(label)
			self.message_labels.append(label)

		# 更新每个 QLabel 的位置
		for i, label in enumerate(self.message_labels):
			label.move(0, (i - 1) * label.height() - self.current_offset)

	def update_messages(self, new_messages):
		"""
		更新中奖信息并刷新显示
		:param new_messages: 新的中奖信息列表
		"""
		self.messages = new_messages
		self.current_offset = 0  # 重置滚动偏移量
		self.create_labels(QFont("微软雅黑", 7, QFont.Bold))  # 重新创建标签

五.心得体会

本次和大家分享了我的大屏可视化方案,软件完全是使用PyQt5实现的,与大家分享了我的软件开发心得与软件代码项目结构还有我的代码片段,希望大家亲自下载体验一下软件,更希望得到大家的反馈!

在这里插入图片描述


http://www.kler.cn/a/504291.html

相关文章:

  • 【IDEA版本升级JDK21报错方法引用无效 找不到符号】
  • 1Hive概览
  • 智能化植物病害检测:使用深度学习与图像识别技术的应用
  • ESP32,uart安装驱动uart_driver_install函数剖析,以及intr_alloc_flags 参数的意义
  • 青少年编程与数学 02-006 前端开发框架VUE 22课题、状态管理
  • FastDDS安装测试记录
  • LeetCode:39. 组合总和
  • FLASK创建下载
  • No.1|Godot|俄罗斯方块复刻|棋盘和初始方块的设置
  • 自动生成数据:SQLark 让数据测试更高效
  • 自定义封装进度条标签
  • 设计模式 行为型 责任链模式(Chain of Responsibility Pattern)与 常见技术框架应用 解析
  • JS后盾人--再一次的走进JS?
  • STM32程序发生异常崩溃时,怎样从串口输出当时的程序调用栈等信息
  • LangChain学习笔记2 Prompt 模板
  • 21_Spring Boot缓存注解介绍
  • 【Go】Go Gin框架初识(一)
  • 从零开始:在服务器上部署大模型并集成到 vscode +Cline使用
  • LLaMa-3 8B + 蒙特卡洛树 约等于 GPT-4
  • 常用的前端4种请求方式
  • 《拉依达的嵌入式\驱动面试宝典》—Linux篇(二)_uboot
  • RocketMQ 知识速览
  • PySide6的资源文件(.qrc 文件)简介以及RCC工具
  • ssm旅游攻略网站设计+jsp
  • 深入理解循环神经网络(RNN):原理、应用与挑战
  • springCloud特色知识记录(基于黑马教程2024年)