赞
踩
由于需求,需要在界面端显示热力图(以地图形式),查阅了比较多的资料,对比了C++和Python,发现还是Python对热力图的支持比较好,所以采用了Python作为开发语言。(如果C++有比较好的方式,欢迎交流)
在此记录一下相关的实现方式,以方便日后查阅。
Echarts是一个由百度开源的数据可视化,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可。而 Python 是一门富有表达力的语言,很适合用于数据处理。当数据分析遇上数据可视化时,pyecharts诞生了。
关于 pyecharts 的强大不用介绍太多,上面那句话就够了。更多内容请访问:https://pyecharts.org/#/zh-cn/intro
由于是采用Python作为界面开发语言,所以pyqt是一个比较好的选择。更多关于pyqt的内容,请访问:https://blog.csdn.net/bailang_zhizun/article/details/79310419
由于热力图是通过 pyecharts 生成的,而 pyecharts 生成 的热力图是以 .html 文件的形式保存的,我们当然可以选择通过手动打开html文件的方式来浏览,但作为程序员,有代码为什么要人工呢?
在QT中,提供了相关的类用于显示网页:QWebEngineView,关于 QWebEngineView 的使用方法可以访问QT的官网进行查看,在此不多做叙述。
所以,在pyqt中,我们也通过这个类来显示网页,下面是代码:
- class HeatmapWidget(QWidget):
- def __init__(self):
- super(HeatmapWidget, self).__init__()
-
- # 创建控件
- self.frm_show = QFrame() # 最好定义一个frame空间,将QWebEngineView对象放进去
-
- self.main_layout = QHBoxLayout() # 界面主布局
-
- # 用于显示网页
- self.my_html = QWebEngineView() # 无干扰情况下的实时热力图的显示
-
- frm_layout = QHBoxLayout() # self.frm_show的布局
- frm_layout.addWidget(self.my_html )
-
- self.frm_show.setLayout(frm_layout)
-
- self.main_layout.addWidget(self.frm_show)
-
- self.setLayout(self.main_layout)
此时,界面就定义好了,界面中包含一个frame控件,然后将QWebEngineView 控件对象放进去。
显示网页:
- html_path = "file:///" + os.path.abspath("file.html")
-
- # repr() 函数可以将字符串转换为python的原始字符串(即忽视各种特殊字符的作用)
- # 然后再使用eval() 函数将原始字符串转换为正常的字符串,不使用eval 输出的字符串会带有 ' ' 引号。
- # str() 和 repr() 都是把对象转换为字符串,但 str() 转换的字符串对用户友好, repr() 转换的字符串对python友好。
- new_str = eval(repr(html_path).replace('\\', '/'))
-
- self.my_html.load(QUrl(new_str)) # reload刷新
刷新网页:
self.my_html.reload() # reload刷新
我在使用pyinstaller打包程序时,使用的 -F 模式,即所有的文件都打包成一个文件(这样会造成生成的文件比较大,启动慢,但好处是只生成了一个文件,看起来简洁)(使用 -c 模式,可以在运行.exe时显示提示信息),但是对于pyecharts的打包并不友好,会造成无法将pyecharts的相关文件打包在一起的问题,即使使用了 --add-data参数也无济于事,所以最终是采用 -D 模式打包程序:
pyinstaller -D -c main.py # 加入 -c 参数是为了看到运行时的运行提示信息,可以使用 -W 参数,这样就不会显示命令行窗口
在生成之后,将安装的pyecharts模块目录下的datasets和render文件夹拷贝到生成的dist/main/pyecharts目录下(pyecharts为新建文件夹),main为我生成的程序的名称(对应main.py)
拷贝到->
这个问题就解决了。
提示信息:Could not find QtWebEngineProcess.exe,但是QtWebEngineProcess这个程序是在生成的目录下的,如下所示:
由此可见,可能这个文件的目录位置不对。
此时,可以把dist/main/PyQt5/Qt/bin 和 dist/main/PyQt5/Qt/resources下面的所有文件复制到dist/main/下就可以了,main是项目名。此时问题就解决了。
当然,此时还有另外一种解决方式,根据运行时提示的信息如下:
在运行时,程序是先在/dist/resources目录下查找是否有Qt WebEngine resources文件,所以,可以将dist/main/PyQt5/Qt/resources拷到dist目录下;
然后程序又在/dist/main/qtwebengine_locals目录下查找是否有QtWebEngineProcess.exe,所以可以在/main目录下新建qtwebengine_locals文件夹,然后将dist/main/PyQt5/Qt/bin下的所有文件拷贝到qtwebengine_locals目录下,这样也能正常运行。如下图所示:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。