Bootstrap

python3GUI--大屏可视化-传染病督导平台 By:PyQt5


大小:60.9 M,软件安装包放在了这里!

请添加图片描述

一.前言

本次仍然给大家带来我使用Pyqt5开发的大屏可视化解决方案,我提供的可视化方案均不依赖于浏览器,所有组件都是QWidget及其子类,大家可以放心学习交流!

二.预览

下面我将截图展示一下本次系统的主要功能
本次软件只有一屏,下面截图为软件主界面
在这里插入图片描述
贴一张动图展示启动后的效果
请添加图片描述

三.软件组成&开发心得

1.样式&使用方法

大屏可视化方案参考了web的前端样式,通过借鉴其可视化方案使用Pyqt5绘制QWidgets的方式实现同样的效果。本软件启动后会自动最大化,软件不包含标题栏,通过按下键盘上的ESC退出。

2.左侧表格实现

本次的可视化二维表格不是使用的QTableWidget 而是使用的网格布局,通过加入水平分割线将数据与数据、表头与数据分割开来,形成表头和数据对应的表格,也算是笔者的一个创新尝试。

3.设计

软件整体是垂直布局,是最上方的头部与下方内容区水平布局,下方的水平布局包括三个QWidget,设置了水平布局,水平比例为1:2:1,尽可能将我们的可视化效果占比达到最大,每个内容区包括2~3个内部组件,在代码上使用不同的类,来区分不同的区域。

4.学习

在本次代码开发撰写当中,学习到了geojson数据的使用,细心的读者可以发现中间的地图是有交互效果的,具体来说是:把鼠标放置到对应的区,鼠标所在的区域会变色,这里说下地图的绘制,数据来源是https://geojson.hxkj.vip/,大家可以在这里根据城市、地区名字or区号下载对应的geojson,这样我们的数据就准备好了,然后进行地图的绘制,我们选择“重写PaintEvent”的方式按照经纬度绘制地图,具体来说可以通过传入不同的geojson数据来绘制不同的地图,比如下面的北京地图:

在这里插入图片描述

5.体验效果

一款成品的大屏可视化方案是存在交互效果的,我们的效果具体体现在:

  • 启动LCD数据变化动画

  • 启动条形图数据变化动画

  • 地图鼠标交互效果

  • 地球外围点、线旋转效果

  • 整体颜色风格效果

  • 实时时间更新

四.代码分享

这里和大家分享单个组件代码

1.环形渐变进度组件

class ProgressCircle(QWidget):
	"""
	进度值圆环组件
	"""

	def __init__(self, p=None):
		super().__init__(p)
		self.ui_init()
		self.ani_init()

	def ui_init(self):
		self._progress = 0  # 当前进度,初始化为0

	def ani_init(self):
		# 创建属性动画
		self.animation = QPropertyAnimation(self, b"progress")
		self.animation.start()  # 启动动画

	# 创建 progress 属性
	def get_progress(self):
		return self._progress

	def set_progress(self, value):
		self._progress = value
		self.update()  # 每次更新 progress 时触发绘制

	progress = pyqtProperty(float, get_progress, set_progress)  # 定义 progress 属性

	def set_target_progress(self, target_progress):
		"""外部设置目标进度值并触发动画"""
		# 创建新的属性动画
		self.animation.stop()  # 停止当前动画
		self.animation = QPropertyAnimation(self, b"progress")
		self.animation.setDuration(800)  # 设置动画时长
		self.animation.setStartValue(self._progress)  # 设置动画起始值为当前进度
		self.animation.setEndValue(target_progress)  # 设置动画结束值为目标进度
		self.animation.start()  # 启动新的动画

	def resizeEvent(self, event):
		# 根据窗口大小动态调整圆环的大小,并保证边缘有 5px 的间隙
		margin = 5  # 设置边缘的间隙为 5px
		self.circle_diameter = min(self.width(), self.height()) - 2 * margin  # 留出 5px 边距
		self.circle_center = self.rect().center()  # 获取窗口中心点

	def paintEvent(self, event):
		painter = QPainter(self)
		painter.setRenderHint(QPainter.Antialiasing)

		# 计算圆环的位置和大小
		radius = self.circle_diameter / 2
		rect = QRectF(self.circle_center.x() - radius, self.circle_center.y() - radius, self.circle_diameter,
					  self.circle_diameter)

		start_angle = 90 * 16  # 从正上方开始(以16进制计算角度)
		span_angle = -(360 * self._progress / 100) * 16  # 根据当前进度百分比调整角度

		# 绘制未划过的部分(背景)
		pen = QPen(QColor(26, 68, 112), 10)  # 未划过部分的颜色
		painter.setPen(pen)
		painter.drawArc(rect, start_angle, 360 * 16)  # 完整的圆环背景

		# 渐变色设置(已划过的部分)
		gradient = QLinearGradient(self.circle_center.x(), self.circle_center.y(), self.circle_center.x() + radius,
								   self.circle_center.y())
		gradient.setColorAt(0, QColor(3, 202, 251))  # 渐变色的起始颜色
		gradient.setColorAt(1, QColor(51, 127, 237))  # 渐变色的结束颜色

		# 设置渐变的画笔
		pen = QPen(gradient, 6)  # 使用渐变色绘制圆环
		painter.setPen(pen)
		painter.drawArc(rect, int(start_angle), int(span_angle))  # 进度部分

		# 绘制文本(进度百分比)
		painter.setPen(QColor(13, 132, 242))  # 内层文字颜色设置为 rgb(13, 132, 242)
		painter.setFont(QFont("微软雅黑", 16))
		text = f"{int(self._progress)}%"  # 显示整数进度
		text_rect = self.rect()
		painter.drawText(text_rect, Qt.AlignCenter, text)

2.自定义图片的背景组件

class BGWidgetBase(QWidget):
	"""
	自定义背景的组件
	"""

	def __init__(self, p=None, bg_pic=""):
		super(BGWidgetBase, self).__init__(p)
		self.bg_pic = bg_pic
		self.setAttribute(Qt.WA_TranslucentBackground, True)

	def set_bg_pic(self, bg_pic):
		self.bg_pic = bg_pic
		self.repaint()
		self.update()

	def paintEvent(self, event):
		super(BGWidgetBase, self).paintEvent(event)
		painter = QPainter(self)
		painter.setRenderHint(QPainter.Antialiasing, True)
		painter.setRenderHint(QPainter.SmoothPixmapTransform, True)
		pixmap = QPixmap(self.bg_pic)
		painter.drawPixmap(QRect(0, 0, self.width(), self.height()), pixmap)
		painter.end()

五.总结

本次和大家分享了我开发的大屏可视化-传染病监督平台,这是一款我比较满意的作品,和大家分享了部分设计细节以及代码,大家能给我点个赞么~
在这里插入图片描述

;