2&TLZ【源码】数据可视化:基于Echarts&PyQT&Flask实现的动态实时【拖拉拽大屏】-数据中心

用程序猿的话来讲,好久没有发新包了,今天就给大家演示Echarts/PyQT/Flask实现的 动态实时拖拉拽大屏 ,重点的事情说三遍:自定义拖拉拽,自定义拖拉拽,自定义拖拉拽!!!

数据可视化大屏的出现,掀起一番又一番的浪潮,众多企业主纷纷想要打造属于自己的“酷炫吊炸天”的霸道总裁大屏驾驶舱。

之前有小伙伴们建议我出一些视频课程来学习Echarts,这样可以更快上手,所以我就追星赶月的录制了《Echarts - 0基础入门课程》,希望对有需要的小伙伴有帮助。

传送门

2+TLZ【源码】数据可视化:基于Echarts+PyQT+Flask实现的动态实时【拖拉拽大屏】-数据中心.zip-企业管理文档类资源-CSDN下载

拖拉拽效果

拖拉拽的切片效果图 

 

 

一、 确定需求方案

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

本案例基于16:9 屏宽比,F11全屏显示。

2、部署方式 

基于免安装可执行程序:支持Windows、Linux、Mac等多种操作系统;

二、整体架构设计

  1. 前端图表 基于Echarts开源库设计,使用WebStorm编辑器;
  2. 前端布局 基于PyQT Dock Spliter 实现;
  3. 后端 基于Python Flask实现,使用 IDEA 编辑器;
  4. 数据传输格式:JSON;
  5. 数据源类型:目前采用JSON文件方式,自行添加Mybatis可支持PostgreSQL、MySQL、Oracle、Microsoft SQL Server、SQLite,自行添加Pandas可支持Excel表格等,还可以定制HTTP API接口方式。
  6. 数据更新方式:采用http get 轮询方式 。在实际应用中,也可以视情况选择j监测后端数据实时更新,实时推送到前端的方式;

三、编码实现 (关键代码)

1、前端html实现 - Echarts图表样式style

这里将每个Echarts独立出一个html页面,为了嵌套到 Pyqt 的 QDockWidget 中。

这个版本对代码进行了优化,将每个Echarts图表独立为一个模块,主页面只需要引入对应的*/loader.js文件,即可实现Echarts图表,非常简便。

效果如图:

html 布局代码如下:


<body style=" background-color:rgb(11, 18, 39)">
    <div id="vue_app" class="container-fluid">

        <div id="container_m1" style="height: 100%; width: 100%;">
        </div>

    </div>
</body>

 js 渲染 echarts 代码如下:

function init_echart_map_china_effectScatter(container) {
  // 基于准备好的dom,初始化echarts实例
  var myChart = echarts.init(document.getElementById(container), window.gTheme);
  var data = [];
  var geoCoordMap = {};
  option = {
    // title: {
    //   text: "国内销售额分布",
    //   top: "5%",
    //   left: "center",
    //   textStyle: {
    //     // color: "hsl(200, 86%, 48%)",
    //     fontSize: "16",
    //   },
    // },

    tooltip: {
      trigger: "item",
      formatter: function (params) {
        if (typeof params.value[2] == "undefined") {
          return params.name + " : " + params.value;
        } else {
          return params.name + " : " + params.value[2];
        }
      },
    },

    geo: {
      map: "china",
      layoutCenter: ["50%", "50%"],
      zoom: 1.5,
      roam: true,
      // 地图放大或缩小的尺寸
      layoutSize: "100%",
      selectedMode: "single",
      label: {
        emphasis: {
          show: false,
        },
      },
      // 地图背景色:蓝色
      itemStyle: {
        normal: {
          areaColor: "#4c60ff",
          borderColor: "#002097",
        },
        emphasis: {
          areaColor: "#293fff",
        },
      },
    },
    series: [
      {
        name: "点图",
        type: "scatter",
        coordinateSystem: "geo",
        data: [],
        symbolSize: function (val) {
          return val[2] / 40;
        },
        label: {
          normal: {
            formatter: "{b}",
            position: "right",
            show: false,
          },
          emphasis: {
            show: true,
          },
        },
      },
      {
        name: "Top 5",
        type: "effectScatter",
        coordinateSystem: "geo",

        data: [],
        symbolSize: function (val) {
          return val[2] / 30;
        },
        showEffectOn: "render",
        rippleEffect: {
          brushType: "stroke",
        },
        hoverAnimation: true,
        label: {
          normal: {
            formatter: "{b}",
            position: "right",
            show: true,
            textStyle: {
              color: "rgba(255,255,255,.8)",
              fontSize: 14,
            },
          },
        },
        zlevel: 1,
      },
    ],
  };

  myChart.setOption(option);
  window.addEventListener("resize", function () {
    myChart.resize();
  });
}

js 动态更新数据代码:


function async_echart_map_china_effectScatter(container, filename) {
  $.getJSON(filename).done(function (data) {
    var myChart = echarts.init(document.getElementById(container));
    myChart.setOption({
      series: [
        { data: data },
        {
          data: data
            .sort(function (a, b) {
              return b.value[2] - a.value[2];
            })
            .slice(0, 5),
        },
      ],
    });
  });
}

2、后端Python Flask WEB 服务器


app = Flask(__name__, static_folder="static", template_folder="template")


@app.route('/')
def hello_world():
    return 'Hello World!'


# 主程序在这里
if __name__ == "__main__":
    # 开启线程,触发动态数据
    a = threading.Thread(target=asyncJson.loop)
    a.start()

    # 开启 flask 服务
    app.run(host='0.0.0.0', port=88, debug=True)

3、拖拉拽布局 QDockWidget

使用 QDockWidget 控制 移动 悬浮 窗口。

使用 QSplitter 分割窗口控制边界。

使用 QWebEngineView 加载 html页面。


    # 创建QDockWidget窗口(标题,自身窗口)
    dock = QDockWidget(title)

    # 实例化QSplitter控件, 并设置初始为水平方向布局
    splitter = QSplitter(Qt.Horizontal)

    # 向Splitter内添加控件。并设置游戏的初始大小
    browser = QWebEngineView()
    browser.load(QUrl(url))

  
    splitter.addWidget(browser)
    dock.setWidget(splitter)

4、数据通信 JSON 格式

[{"name": "长沙", "value": [113.019455, 28.200103, 661]}, {"name": "海门", "value": [121.15, 31.89, 194]}, {"name": "赤峰", "value": [118.87, 42.28, 161]}, {"name": "鄂尔多斯", "value": [109.781327, 39.608266, 194]}, {"name": "招远", "value": [120.38, 37.35, 835]}, {"name": "舟山", "value": [122.207216, 29.985295, 706]}, {"name": "齐齐哈尔", "value": [123.97, 47.33, 857]}, {"name": "盐城", "value": [120.13, 33.38, 696]}, {"name": "青岛", "value": [120.33, 36.07, 569]}, {"name": "乳山", "value": [121.52, 36.89, 108]}, {"name": "金昌", "value": [102.188043, 38.520089, 732]}, {"name": "泉州", "value": [118.58, 24.93, 649]}]

四、开发配置&代码结构说明

<!-- 启动server命令 -->
python main.py 

<!-- 浏览器中输入网址查看大屏(端口为 main.py 中的 port 参数定义) -->
http://localhost:88/static/xxx/index.html

<!-- 启动dock命令 -->
python dock.py 
----------

<!-- 逻辑说明  -->
http 服务器:使用 python flask 框架实现
前端页面布局 index.html 实现方式: 使用bootstrap布局
前端 echarts 图表实现方式:每个图表独立的js文件实现
动态数据 *.json 实现方式: 
  asyncJson.py 定时修改json数据源(python asyncJson.py )
  客户端定时器(setInterval();)定时刷最新数据

调用方式:
  需要《点 流向 区域》等地图,只需导入对应目录下的 loader.js 即可

----------

<!-- 更多资料参考我的博客主页  -->
https://yydatav.blog.csdn.net/

<!-- 更多案例参考 -->
https://blog.csdn.net/lildkdkdkjf/article/details/120705616

我的微信号:6550523  欢迎多多交流

五、更多案例 


YYDatav的数据可视化大屏《精彩案例汇总》(Python&Echarts源码)_YYDataV的博客-CSDN博客

《工厂订单出入库信息管理系统》完整案例详解(含演示网址账号)(Go&Vue源码)_YYDataV的博客-CSDN博客

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

猜你喜欢

转载自blog.csdn.net/lildkdkdkjf/article/details/123730912