前言

继前文Python在PyQt5中使用ECharts绘制图表中在Python程序中添加网页展示ECharts图表,和Python使用QWebEngineView时报错Uncaught ReferenceError的解决中解决页面加载过慢的问题之后,又遇到了新的问题,那就是QWebEngineView加载的页面右键会有一个reload功能,即重新加载页面,重新加载后问题就出现了,它加载的是原网页,需要通过runJavaScript重新修改option里的内容,这不够理想。于是采取新的策略,将原来写的HTML当做模板,获取数据后根据模板并将数据写入生成新的HTML文件,再加载到QWebEngineView里,这样随便怎么刷新都不会没有数据,顶多是先前的视角缩放什么的会重置,但无伤大雅。

简介

Jinja是Python下一个广泛应用的、快速、富有表现力、可扩展的模板引擎,设计思想来源于Django的模板引擎,并扩展了其语法和一系列强大的功能。

使用

  1. 新建一个临时文件夹存放生成的生成的HTML
import os

if not os.path.exists("temp"):
os.mkdir("temp")

Python有专门生成临时文件夹或文件的库,叫tempfile,但由于HTML里导入文件的路径问题放弃使用了,如:

import tempfile

temp_folder = tempfile.mkdtemp()
file_name = "file_name.html"
with open(os.path.join(temp_folder, file_name), "w") as file_out:
pass
  1. 修改HTML文件为模板

    仍然以最初文章中雷达图为例,将需要替换的内容用{{ }}标识出:

    这里就摘出关键部分
<script type="text/javascript">
let option = {
radar: {
shape: 'circle',
indicator: [
{ name: 'A', max: 100},
{ name: 'B', max: 100},
{ name: 'C', max: 100},
{ name: 'D', max: 100}
]
},
series: [{
type: 'radar',
data: [
{
// value: [0, 0, 0, 0],
value: {{ temp_value }} // 价格需要替换的内容以{{变量名}}来表示
areaColor: "rgba(151,181,215,0.6)",
areaStyle: "color",
label: {
show: true,
formatter: function (params) {
// 可自定义显示内容
return params.value
}
}
}
]
}]
};
</script>

除此之外还有个很重要的地方,就是HTML导入echarts.js的路径也要注意,因为上面临时文件夹是新创建的空文件夹,里面没有也不应该有别的文件,所以echarts.js不会和生成的HTML文件在一起,也就是这里导入的路径需要修改为echarts.js的实际路径,仍然是通过模板来替换。

<script src="{{ temp_echarts }}"></script>
  1. 载入模板
import Environment, FileSystemLoader

temp_path = os,path.join(os.path.dirname(os.path.abspath(__file__)), "templates")  // 获取根目录并拼接,更可靠
env = Environment(loader=FileSystemLoader("templates")
template = env.get_template("template_echarts_radar.html")
  1. 获取数据,略
  2. 写入数据,生成文件并载入
file_path = "temp/radar.html"
with open(file_path, "w", encoding="utf-8") as file_out:
html_content = template.render(
temp_echarts = "../***/echarts.js",
temp_value = [1, 2, 3, 4]
)
file_out.write(html_content) # 加载,格式不能忘
radar_view.load(QUrl("file:///" + file_path)

——终——

【jinja2】Python根据模板生成HTML文件并加载进QWebEngineView的更多相关文章

  1. Spire.XLS,生成Excel文件、加载Excel文件

    一.组件介绍 Spire.XLS是E-iceblue开发的一套基于企业级的专业Office文档处理的组件之一,全称Spire.Office for .NET.旗下有Spire.Doc,Spire XL ...

  2. python 从private key pem文件中加载public key

    import rsa import logging from Crypto.PublicKey import RSA class RsaUtil: def __init__(self, pem_fil ...

  3. 利用html模板生成Word文件(服务器端不需要安装Word)

    利用html模板生成Word文件(服务器端不需要安装Word) 由于管理的原因,不能在服务器上安装Office相关组件,所以只能采用客户端读取Html模板,后台对模板中标记的字段数据替换并返回给客户端 ...

  4. 根据PDF模板生成PDF文件(基于iTextSharp)

    根据PDF模板生成PDF文件,这里主要借助iTextSharp工具来完成.场景是这样的,假如要做一个电子协议,用过通过在线填写表单数据,然后系统根据用户填写的数据,生成电子档的协议.原理很简单,但是每 ...

  5. Python 使用cx_freeze 生成exe文件【转】

    Python 使用cx_freeze 生成exe文件   在python中比较常用的python转exe方法有三种,分别是cx_freeze,py2exe,PyInstaller.py2exe恐怕是三 ...

  6. 使用word模板生成pdf文件

    使用word模板生成pdf文件 源码:UserWord

  7. Django---MTV和MVC的了解,Django的模版语言变量和逻辑,常见的模板语言过滤器,自定义过滤器,CSRF了解,Django的母版(继承extends,块block,组件include,静态文件的加载load static),自定义simple_tag和inclusion_tag

    Django---MTV和MVC的了解,Django的模版语言变量和逻辑,常见的模板语言过滤器,自定义过滤器,CSRF了解,Django的母版(继承extends,块block,组件include,静 ...

  8. js判断flash文件是否加载完毕

    轮询判断加载进度 img的加载完成有onload方法,一直不知道该怎么判断swf文件是否加载完毕了? 在应用中使用了轮询判断加载进度值PercentLoaded是否达到100,经测试,可以达到效果. ...

  9. C#遍历XML文件动态加载菜单

    通过遍历XML文件动态加载菜单,顺便利用WebBrowser控件实现一个简单的桌面浏览器 效果如下: 代码如下: XMLFile1.xml <?xml version="1.0&quo ...

  10. Java_类文件及加载机制

    类文件及类加载机制 标签(空格分隔): Java 本篇博客的重点是分析JVM是如何进行类的加载的,但同时我们会捎带着说一下Class类文件结构,以便对类加载机制有更深的理解. 类文件结构 平台无关性 ...

随机推荐

  1. Linux环境下给python项目写个启停服务

    写个服务,写完后放在/lib/systemd/system路径下 update_rule.server [Unit] Description = TinyScan update rule [Servi ...

  2. MyBatis_01(前置知识)

    1-学习思路(课程主要内容): 2-MyBatis特性 3- MyBatis下载 但是我们在使用MyBatis的时候,都是直接 "Maven导入MyBatis的jar包" (所以, ...

  3. Nlog连接密码隐藏

  4. windows2012安装.net4.7.2

    第一步,下载.net4.7.2安装包 离线包:https://download.visualstudio.microsoft.com/download/pr/1f5af042-d0e4-4002-9c ...

  5. 【Python实例】用脚本自动拿一个或多个仿真环境

    注1:之前使用的是perl,现在尝试切换到python; 注2:该脚本用于实现自动拿仿真环境,里面应该还有很多不足之处,后续逐渐完善; 注3:假设脚本名字为get_env.py,直接执行脚本,会有两次 ...

  6. @Component类相互引用的加载顺序

    发现bug:没有消息通知,看日志发现调用消息通知的url前缀为null,定位到此工具类 进入工具类 进入ComponentConstant类:它引用了两个配置类 问题:component标注的类相互引 ...

  7. 远程过程调用失败0x800706be

    今天用数据库突然发生了<远程过程调用失败0x800706be>,参考一下网站解决 https://www.cnblogs.com/guohenghai/p/3533091.html 今天在 ...

  8. 小程序Day01

    注册一个微信小程序账号测试号不能用云开发 构建npm(下载node.js) npm i @vant/weapp -S --production if wrong npm init//npm intal ...

  9. Nucmer+LINKVIEW实现序列水平的共线性分析

    https://www.cnblogs.com/johnsonzzz/p/15151634.html https://github.com/YangJianshun/LINKVIEW 可以绘制两个基因 ...

  10. spring security 基于角色的控制,可运行。

    基于角色的访问控制 建表语句,见 上一篇 的博文,  https://www.cnblogs.com/sdgtxuyong/p/16157870.html 在配置类中,@EnableGlobalMet ...