当前位置:   article > 正文

【1+TLZ】数据可视化:基于 Pyecharts + PyQT 实现的动态实时拖拉拽大屏 - 互联网企业数据分析_pyqt 大数据界面

pyqt 大数据界面

目录

 

精彩案例汇总

效果展示

1、首先看动态效果图 

2、实时分片数据图 - 标准版面

3、实时分片数据图 - 将柱状图放大后的自适应版面

4、实时分片数据图 - 将地图放大后的自适应版面

一、 确定需求方案

1、确定产品上线部署的屏幕LED分辨率

2、功能模块

3、部署方式

二、整体架构设计

三、编码实现 (基于篇幅及可读性考虑,此处展示部分关键代码)

1、设计页面布局原型:使用QSplitter实现自适应拖拉拽功能 

2、实现加载Html功能:把QFrame换成QWebEngineView

3、美化界面,加上背景瞬间高端大气上档次

4、最后,完整布局代码

四、上线运行

五、源码下载

精彩案例汇总


写在前面,用程序猿的话来讲,好久没有发新版本了,今天就给大家演示Pyhon实现的 动态实时拖拉拽大屏 ,重点的事情说三遍:自定义拖拉拽,自定义拖拉拽,自定义拖拉拽!!!

近年来,数据可视化大屏的出现,掀起一番又一番的浪潮,众多企业主纷纷想要打造属于自己的 “酷炫吊炸天” 的霸道总裁大屏驾驶舱。今天为大家分享的是 【互联网企业数据分析】。

之前小伙伴们建议我出一些视频课程来学习Echarts,这样可以更快上手,所以我就追星赶月的录制了《Echarts - 0基础入门课程》Echarts-0基础入门--其他视频教程-编程语言-CSDN程序员研修院 ,希望小伙伴们多多支持。

精彩案例汇总

YYDatav的数据可视化《精彩案例汇总》_YYDataV的博客-CSDN博客

话不多说,开始分享干货,欢迎讨论!微信: 6550523

效果展示

1、首先看动态效果图 

2、实时分片数据图 - 标准版面

标准版面
标准版面

3、实时分片数据图 - 将柱状图放大后的自适应版面

将三维柱状图放大后的自适应版面
将柱状图放大后的自适应版面

4、实时分片数据图 - 将地图放大后的自适应版面

将地图放大后的自适应版面
将地图放大后的自适应版面

一、 确定需求方案

1、确定产品上线部署的屏幕LED分辨率

1920px*1080px,F11全屏后占满整屏且无滚动条。其它分辨率也可自适应。

2、功能模块

包括:Pie-饼图,Liquid-数据精度,Line-面积图,Grid-降雨量,Geo-实时货物运输,Bar-产品销量,Bar3d-城市人口,其他echarts图表功能可举一反三实现

3、部署方式

基于免安装可执行程序:支持Windows、Linux、Mac等各种操作系统;将程序复制到服务器上即可,需要python3运行环境;

二、整体架构设计

  1. 前端基于Pyecharts开源库设计,使用PyQt实现窗口界面,使用Pycharm编辑器;

  2. 数据源类型:目前已支持PostgreSQL、MySQL、Oracle、Microsoft SQL Server、SQLite等,还可以定制其它类型数据库

  3. 数据更新方式:采用前端页面定时拉取的方式,后端http server返回数据;
     

三、编码实现 (基于篇幅及可读性考虑,此处展示部分关键代码)

1、设计页面布局原型:使用QSplitter实现自适应拖拉拽功能 

共分为9个QSplitter,10个QFrame。

代码实现:

  1. import sys
  2. from PyQt5.QtWidgets import (QWidget, QHBoxLayout, QVBoxLayout, QFrame,
  3. QSplitter, QStyleFactory, QApplication)
  4. from PyQt5.QtCore import Qt
  5. class Example(QWidget):
  6. def __init__(self):
  7. super().__init__()
  8. self.initUI()
  9. def initUI(self):
  10. main_box = QHBoxLayout(self)
  11. frame1 = QFrame(self)
  12. frame1.setFrameShape(QFrame.StyledPanel)
  13. frame2 = QFrame(self)
  14. frame2.setFrameShape(QFrame.StyledPanel)
  15. frame3 = QFrame(self)
  16. frame3.setFrameShape(QFrame.StyledPanel)
  17. frame4 = QFrame(self)
  18. frame4.setFrameShape(QFrame.StyledPanel)
  19. frame5 = QFrame(self)
  20. frame5.setFrameShape(QFrame.StyledPanel)
  21. frame6 = QFrame(self)
  22. frame6.setFrameShape(QFrame.StyledPanel)
  23. frame7 = QFrame(self)
  24. frame7.setFrameShape(QFrame.StyledPanel)
  25. frame8 = QFrame(self)
  26. frame8.setFrameShape(QFrame.StyledPanel)
  27. frame9 = QFrame(self)
  28. frame9.setFrameShape(QFrame.StyledPanel)
  29. frame10 = QFrame(self)
  30. frame10.setFrameShape(QFrame.StyledPanel)
  31. splitter1 = QSplitter(Qt.Vertical)
  32. splitter2 = QSplitter(Qt.Horizontal)
  33. splitter3 = QSplitter(Qt.Horizontal)
  34. splitter4 = QSplitter(Qt.Vertical)
  35. splitter5 = QSplitter(Qt.Horizontal)
  36. splitter6 = QSplitter(Qt.Vertical)
  37. splitter7 = QSplitter(Qt.Vertical)
  38. splitter8 = QSplitter(Qt.Vertical)
  39. splitter9 = QSplitter(Qt.Vertical)
  40. splitter1.addWidget(frame1)
  41. splitter1.addWidget(splitter2)
  42. splitter1.setSizes([1, 5])
  43. splitter2.addWidget(splitter6)
  44. splitter2.addWidget(splitter3)
  45. splitter2.setSizes([1, 3])
  46. splitter3.addWidget(splitter4)
  47. splitter3.addWidget(splitter8)
  48. splitter3.setSizes([2, 1])
  49. splitter4.addWidget(splitter5)
  50. splitter4.addWidget(frame2)
  51. splitter4.setSizes([1, 3])
  52. splitter5.addWidget(frame3)
  53. splitter5.addWidget(frame4)
  54. splitter6.addWidget(frame5)
  55. splitter6.addWidget(splitter7)
  56. splitter6.setSizes([1, 2])
  57. splitter7.addWidget(frame6)
  58. splitter7.addWidget(frame7)
  59. splitter8.addWidget(frame8)
  60. splitter8.addWidget(splitter9)
  61. splitter8.setSizes([1, 2])
  62. splitter9.addWidget(frame9)
  63. splitter9.addWidget(frame10)
  64. main_box.addWidget(splitter1)
  65. self.setLayout(main_box)
  66. self.setGeometry(300, 300, 300, 200)
  67. self.setWindowTitle('QSplitter')
  68. self.show()
  69. if __name__ == '__main__':
  70. app = QApplication(sys.argv)
  71. ex = Example()
  72. sys.exit(app.exec_())

2、实现加载Html功能:把QFrame换成QWebEngineView

  1. import sys
  2. from PyQt5.QtWidgets import (QWidget, QHBoxLayout, QSplitter, QApplication)
  3. from PyQt5.QtCore import (Qt, QUrl)
  4. from PyQt5.QtWebEngineWidgets import *
  5. class MainWindow(QWidget):
  6. def __init__(self):
  7. super().__init__()
  8. self.initUI()
  9. def initUI(self):
  10. main_box = QHBoxLayout(self)
  11. self.browser1 = QWebEngineView()
  12. self.browser1.load(QUrl('http://www.baidu.com'))
  13. self.browser2 = QWebEngineView()
  14. self.browser2.load(QUrl('http://www.baidu.com'))
  15. self.browser3 = QWebEngineView()
  16. self.browser3.load(QUrl('http://www.baidu.com'))
  17. self.browser4 = QWebEngineView()
  18. self.browser4.load(QUrl('http://www.baidu.com'))
  19. self.browser5 = QWebEngineView()
  20. self.browser5.load(QUrl('http://www.baidu.com'))
  21. self.browser6 = QWebEngineView()
  22. self.browser6.load(QUrl('http://www.baidu.com'))
  23. self.browser7 = QWebEngineView()
  24. self.browser7.load(QUrl('http://www.baidu.com'))
  25. self.browser8 = QWebEngineView()
  26. self.browser8.load(QUrl('http://www.baidu.com'))
  27. self.browser9 = QWebEngineView()
  28. self.browser9.load(QUrl('http://www.baidu.com'))
  29. self.browser10 = QWebEngineView()
  30. self.browser10.load(QUrl('http://www.baidu.com'))
  31. splitter1 = QSplitter(Qt.Vertical)
  32. splitter2 = QSplitter(Qt.Horizontal)
  33. splitter3 = QSplitter(Qt.Horizontal)
  34. splitter4 = QSplitter(Qt.Vertical)
  35. splitter5 = QSplitter(Qt.Horizontal)
  36. splitter6 = QSplitter(Qt.Vertical)
  37. splitter7 = QSplitter(Qt.Vertical)
  38. splitter8 = QSplitter(Qt.Vertical)
  39. splitter9 = QSplitter(Qt.Vertical)
  40. splitter1.addWidget(self.browser1)
  41. splitter1.addWidget(splitter2)
  42. splitter1.setSizes([1, 5])
  43. splitter2.addWidget(splitter6)
  44. splitter2.addWidget(splitter3)
  45. splitter2.setSizes([1, 3])
  46. splitter3.addWidget(splitter4)
  47. splitter3.addWidget(splitter8)
  48. splitter3.setSizes([2, 1])
  49. splitter4.addWidget(splitter5)
  50. splitter4.addWidget(self.browser2)
  51. splitter4.setSizes([1, 3])
  52. splitter5.addWidget(self.browser3)
  53. splitter5.addWidget(self.browser4)
  54. splitter6.addWidget(self.browser5)
  55. splitter6.addWidget(splitter7)
  56. splitter6.setSizes([1, 2])
  57. splitter7.addWidget(self.browser6)
  58. splitter7.addWidget(self.browser7)
  59. splitter8.addWidget(self.browser8)
  60. splitter8.addWidget(splitter9)
  61. splitter8.setSizes([1, 2])
  62. splitter9.addWidget(self.browser9)
  63. splitter9.addWidget(self.browser10)
  64. main_box.addWidget(splitter1)
  65. self.setLayout(main_box)
  66. self.setGeometry(300, 300, 600, 500)
  67. self.setWindowTitle('QSplitter')
  68. self.show()
  69. if __name__ == '__main__':
  70. app = QApplication(sys.argv)
  71. ex = MainWindow()
  72. sys.exit(app.exec_())

3、美化界面,加上背景瞬间高端大气上档次

  1. def setBackground(self):
  2. palette = QPalette()
  3. pix = QPixmap("./images/bg.jpg")
  4. pix = pix.scaled(self.width(), self.height())
  5. palette.setBrush(QPalette.Background, QBrush(pix))
  6. self.setPalette(palette)

4、最后,完整布局代码

  1. import sys
  2. from PyQt5.QtWidgets import (QWidget, QHBoxLayout, QSplitter, QApplication)
  3. from PyQt5.QtCore import (Qt, QUrl)
  4. from PyQt5.QtWebEngineWidgets import QWebEngineView, QWebEngineSettings
  5. from PyQt5.QtGui import QPalette, QPixmap, QBrush, QColor
  6. from render_html import *
  7. #pip3 install PyQt5==5.15.2
  8. #pip3 install pyecharts==1.9.0
  9. #所有图表参考https://pyecharts.org/#/zh-cn/intro
  10. #范例和展示效果https://gallery.pyecharts.org/#/README
  11. #使用方法https://www.jianshu.com/p/554d64470ec9
  12. #加载速度https://www.cnblogs.com/tomoya0307/p/12737117.html
  13. #参考范例模板https://blog.csdn.net/lildkdkdkjf/article/details/106571356
  14. class MainWindow(QWidget):
  15. render = RenderHtml()
  16. def __init__(self):
  17. super().__init__()
  18. self.initUI()
  19. self.setBackground()
  20. #设置背景图
  21. def setBackground(self):
  22. palette = QPalette()
  23. pix = QPixmap("./images/bg.jpg")
  24. pix = pix.scaled(self.width(), self.height(), Qt.IgnoreAspectRatio, Qt.SmoothTransformation)#自适应图片大小
  25. palette.setBrush(self.backgroundRole(), QBrush(pix))# 设置背景图片
  26. #palette.setColor(self.backgroundRole(), QColor(192, 253, 123)) # 设置背景颜色
  27. self.setPalette(palette)
  28. #画界面元素
  29. def initUI(self):
  30. main_box = QHBoxLayout(self)
  31. self.browser1 = QWebEngineView()
  32. self.browser1.page().setBackgroundColor(Qt.transparent)
  33. self.browser1.page().settings().setAttribute(QWebEngineSettings.ShowScrollBars, False)
  34. self.browser1.load(QUrl("file:///html/title.html"))
  35. self.browser2 = QWebEngineView()
  36. self.browser2.page().setBackgroundColor(Qt.transparent)
  37. self.browser2.page().settings().setAttribute(QWebEngineSettings.ShowScrollBars, False)
  38. self.render.Geo_lines("html/geo_lines.html")
  39. self.browser2.load(QUrl("file:///html/geo_lines.html"))
  40. self.browser3 = QWebEngineView()
  41. self.browser3.page().setBackgroundColor(Qt.transparent)
  42. self.browser3.page().settings().setAttribute(QWebEngineSettings.ShowScrollBars, False)
  43. self.render.Liquid_data_precision("html/liquid_data_precision.html")
  44. self.browser3.load(QUrl("file:///html/liquid_data_precision.html"))
  45. self.browser4 = QWebEngineView()
  46. self.browser4.page().setBackgroundColor(Qt.transparent)
  47. self.browser4.page().settings().setAttribute(QWebEngineSettings.ShowScrollBars, False)
  48. self.render.Liquid_without_outline("html/liquid_without_outline.html")
  49. self.browser4.load(QUrl("file:///html/liquid_without_outline.html"))
  50. self.browser5 = QWebEngineView()
  51. self.browser5.page().setBackgroundColor(Qt.transparent)
  52. self.browser5.page().settings().setAttribute(QWebEngineSettings.ShowScrollBars, False)
  53. self.render.Gauge("html/gauge.html")
  54. self.browser5.load(QUrl("file:///html/gauge.html"))
  55. self.browser6 = QWebEngineView()
  56. self.browser6.page().setBackgroundColor(Qt.transparent)
  57. self.browser6.page().settings().setAttribute(QWebEngineSettings.ShowScrollBars, False)
  58. self.render.Stack_bar_percent("html/stack_bar_percent.html")
  59. self.browser6.load(QUrl("file:///html/stack_bar_percent.html"))
  60. self.browser7 = QWebEngineView()
  61. self.browser7.page().setBackgroundColor(Qt.transparent)
  62. self.browser7.page().settings().setAttribute(QWebEngineSettings.ShowScrollBars, False)
  63. self.render.Bar3d_punch_card("html/bar3d_punch_card.html")
  64. self.browser7.load(QUrl("file:///html/bar3d_punch_card.html"))
  65. self.browser8 = QWebEngineView()
  66. self.browser8.page().setBackgroundColor(Qt.transparent)
  67. self.browser8.page().settings().setAttribute(QWebEngineSettings.ShowScrollBars, False)
  68. self.render.Grid_multi_yaxis("html/grid_multi_yaxis.html")
  69. self.browser8.load(QUrl("file:///html/grid_multi_yaxis.html"))
  70. self.browser9 = QWebEngineView()
  71. self.browser9.page().setBackgroundColor(Qt.transparent)
  72. self.browser9.page().settings().setAttribute(QWebEngineSettings.ShowScrollBars, False)
  73. self.render.Line_areastyle_boundary_gap("html/line_areastyle_boundary_gap.html")
  74. self.browser9.load(QUrl("file:///html/line_areastyle_boundary_gap.html"))
  75. self.browser10 = QWebEngineView()
  76. self.browser10.page().setBackgroundColor(Qt.transparent)
  77. self.browser10.page().settings().setAttribute(QWebEngineSettings.ShowScrollBars, False)
  78. self.render.Pie_position("html/pie_position.html")
  79. self.browser10.load(QUrl("file:///html/pie_position.html"))
  80. splitter_width = 2
  81. splitter1 = QSplitter(Qt.Vertical)
  82. #splitter1.setStyleSheet("QSplitter::handle { background-color: white }")
  83. splitter1.setStyleSheet("QSplitter::handle { background-color: rgb(0,51,102) }")
  84. #splitter1.setStyleSheet("background-color: rgb(255,255,255);")
  85. splitter1.setHandleWidth(splitter_width)
  86. splitter2 = QSplitter(Qt.Horizontal)
  87. splitter2.setHandleWidth(splitter_width)
  88. splitter3 = QSplitter(Qt.Horizontal)
  89. splitter3.setHandleWidth(splitter_width)
  90. splitter4 = QSplitter(Qt.Vertical)
  91. splitter4.setHandleWidth(splitter_width)
  92. splitter5 = QSplitter(Qt.Horizontal)
  93. splitter5.setHandleWidth(splitter_width)
  94. splitter6 = QSplitter(Qt.Vertical)
  95. splitter6.setHandleWidth(splitter_width)
  96. splitter7 = QSplitter(Qt.Vertical)
  97. splitter7.setHandleWidth(splitter_width)
  98. splitter8 = QSplitter(Qt.Vertical)
  99. splitter8.setHandleWidth(splitter_width)
  100. splitter9 = QSplitter(Qt.Vertical)
  101. splitter9.setHandleWidth(splitter_width)
  102. splitter1.addWidget(self.browser1)
  103. splitter1.addWidget(splitter2)
  104. splitter1.setSizes([1, 13])
  105. splitter2.addWidget(splitter6)
  106. splitter2.addWidget(splitter3)
  107. splitter2.setSizes([1, 3])
  108. splitter3.addWidget(splitter4)
  109. splitter3.addWidget(splitter8)
  110. splitter3.setSizes([2, 1])
  111. splitter4.addWidget(splitter5)
  112. splitter4.addWidget(self.browser2)
  113. splitter4.setSizes([1, 3])
  114. splitter5.addWidget(self.browser3)
  115. splitter5.addWidget(self.browser4)
  116. splitter6.addWidget(self.browser5)
  117. splitter6.addWidget(splitter7)
  118. splitter6.setSizes([1, 2])
  119. splitter7.addWidget(self.browser6)
  120. splitter7.addWidget(self.browser7)
  121. splitter8.addWidget(self.browser8)
  122. splitter8.addWidget(splitter9)
  123. splitter8.setSizes([1, 2])
  124. splitter9.addWidget(self.browser9)
  125. splitter9.addWidget(self.browser10)
  126. main_box.addWidget(splitter1)
  127. self.setLayout(main_box)
  128. self.setGeometry(0, 0, 2000, 1000)
  129. self.setWindowTitle('大屏展示')
  130. self.show()
  131. def resizeEvent(self, event):
  132. print("resizeEvent")
  133. self.setBackground()
  134. if __name__ == '__main__':
  135. app = QApplication(sys.argv)
  136. ex = MainWindow()
  137. sys.exit(app.exec_())

四、上线运行

五、源码下载

【源码】数据可视化:基于Pyecharts+PyQT实现的动态实时【拖拉拽】大屏范例1-互联网企业数据分析.zip_pyecharts数据大屏-管理软件文档类资源-CSDN下载

精彩案例汇总

YYDatav的数据可视化《精彩案例汇总》_YYDataV的博客-CSDN博客

本次分享结束,欢迎讨论!QQ微信同号: 6550523

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/570779
推荐阅读
相关标签
  

闽ICP备14008679号