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实现的,与大家分享了我的软件开发心得与软件代码项目结构还有我的代码片段,希望大家亲自下载体验一下软件,更希望得到大家的反馈!