当前位置:网站首页>tkwebview2创作心得
tkwebview2创作心得
2022-08-03 20:22:00 【Smart-Space】
tkwebview2创作心得
引言
目前,tkwebview2应该是tkinter嵌入网页控件最好的为二方法之一,另一种是使用cef。但是,在WebView2开始流行的今天,简单的tkwebview2应该是既使用简便、又功能丰富,其基础WebView2还有微软团队的持续支持。
我断断续续使用了两年时间来探索tkinter显示HTML网页的各种方法,我并不是专业人员,但是,最终,我找到了一个十分简单的方法,那就是使用WebView2。最初我只将其用在自己的小项目里面,直到2021年底,才将其写成tkwebview2并发布到PYPI上,2022年上传至Github。
作为tkwebview2的开发者(Smart-Space,最初在CSDN上公布),我也很高兴为大家提供这一个工具,也欢迎更多需要的人能够为tkwebview2的发展继续做出贡献。
这里我简述一下tkwebview2诞生过程,以及在此之间的经过,以便需要的人更好地了解和使用tkwebview2。
最初的tkinter网页渲染探索
网络查找
我一直认为tkinter很好玩,字面意思,就像玩具一样。几年前的一天,我在想tkinter是否能够显示网页,能的话很多功能tkinter就具备了。
HTML layout
web app
视频
地图
然后我就到网络上查找。
但是很遗憾,相关资料甚少,而且都分别有以下几个问题中的一个或多个:
年代久远
比如TkHtml30,上世纪的作品。虽然经过tkinterweb开发者的起死回生,现在用起来还真的很顺手。我很佩服当年开发TkHtml的人,但是不管怎么样,如今用来,不能显示多媒体,受tkinter限制,是这些库的主要限制,而脱离时代更是其致命缺陷。
依赖庞杂
比如ceftkinter,基于cefpython。使用庞大的cef库,并且控件操作,特别是前期的嵌套绑定代码,十分复杂。
简单的使用文本框
比如tkhtmlview,使用Text解析HTML。这样的话就跟富文本一样了,受tkinter,而且其富文本渲染程度和效果远不及我的TinEngine。
没有可靠代码
这个很多,大家自己搜一搜都知道,有一些给出的代码乱七八糟,方法没有说详细,甚至连效果图都没有,纯属赚流量。最讨厌那些抄袭别人而且又乱抄的人,访问量那么多,真的是愧对于原创。
尝试自己编写
所以到头来,网络上(2019年以前),根本没有可靠的、免费的tkinter显示网页的方法。
于是那就自己来。
刚开始属实能力有限,而且编程只是业余爱好(虽然现在也是。。。)。因此,之能够依靠极度现成的东西了——aardio。当时正好碰见了这个编程语言。
其实还有易语言,为什么放弃大家都懂。
最开始就是嵌入窗口方向。使用aardio写一个可辨识的窗口。
tkinter浏览器组件,这就是我最初在CSDN上发布的tkinter嵌入网页浏览器控件的方法。这个方法于2020年9月12日10:53:53公布。现在看来很简单粗暴,不过至此,我就开始自己实现tkinter网页控件的嵌套方向。
miniblink小插曲
期间,我看到了一个称为miniblink的控件库很好用,而且还有python的绑定。于是,我将其移植到了tkinter上——tkinter+miniblink实现网页组件_Smart-Space的博客-CSDN博客_tkinter显示网页,2021年2月13日10:08:16发布。
但是很明显,一个免费前提下的不完全体网页控件,不是很实用,但够用。
使用IE的tkinterie
初具雏形
仍然是实力有限,我在接下来近一年的时间里,都在使用基于完全窗口嵌套的浏览器组件。在此期间,我只能够提供方法,不能够提供相应的拓展库。这种方法缺点是真的多,我在相关文章已经解释过,这里不再赘述。
后来,我发现了IE提供的com控件,使用ieframe.dll。但是,没准,python用不了com控件。既然无法直接使用那么就现继续延续嵌套窗口的做法。
最开始使用comtypes,并且于2021年5月5日发布了最初版本的tkinterie库。
只不过这次没有写成创作文章放在CSDN上,而是当作一个更新消息发布。tkinter浏览器组件_Smart-Space的博客-CSDN博客_tkinter内嵌浏览器中2021-8-10更新。
新的API
后来,应该是2022年初,我能够实现在tkinter中使用WinForms控件,并且能够使用STA线程创建应用GUI。因此,新版的tkinterie随之而来,不再使用comtypes,而是使用基于Net绑定的pythonnet,这样就可以使用Forms的WebBrowser控件了。这样带来了以下好处:
首次解决嵌套方法的焦点问题
直接操控控件方法,只不过需要会WinForms的WebBrowser。
tkinter浏览器组件_Smart-Space的博客-CSDN博客_tkinter内嵌浏览器中2022-4-9更新。
虽然右键发现使用的是edge内核,但是难保,这还是基于IE。
tkinterie维护结束
其实到了tkinterie-1.4.1-,基本就没有什么要继续开发的了,tkinterie已经能够为tkinter提供一个比较稳定的网页渲染控件了。
tkinterie也被release-monitoring(tkinterie · Anitya)和Libraries(tkinterie 1.5.0 on PyPI - Libraries.io)收录。
此外,tkinterie也被其它使用者用在自己的项目,比如Python Gui 初探(一)tkinter多页面切换 - wjw的blog。对于我来说,当然很高兴。
使用WebView2打造tkwebview2
决定使用
随着IE时代的褪去,tkinterie稳定性必然下降,不过只要WinForms的WebBrowser没事,tkinterie就没事。不过,微软也开始将WebView2作为WinForms的网页控件。
当时,一看到WinForms,以及能在其上面使用的WebView2.Forms,再想想我已经能够在tkinter中使用winforms控件,就知道机会来了。
更好的是,我发现了pywebview,其中通过winforms使用WebView2的初始化代码已经写好了,不需要我从头开始写起。
初版tkwebview2
刚开始因为各种因素,我只是了改写了pywebview的窗口初始化代码,沿用之前的窗口嵌套思路。
所以刚开始,在2021年12月25日12:08:15发布的tkinter使用WebView2网页组件_Smart-Space的博客-CSDN博客_tkinter webview中,只是提供了pywebview窗口的绑定。那个时候还不清楚在STA中使用WebView2。
解决运行时问题
这个问题,在crestgod(crestgod的博客_CSDN博客)提出解决方法之前,一头雾水。
那就是Python.Runtime.PythonException: TypeError : argument of type 'NoneType' is not iterable
支配的恐惧。
后来发现,是因为WebView2 Runtime没有安装的缘故。于是,在tkinter使用WebView2网页组件_Smart-Space的博客-CSDN博客_tkinter webview的2022-4-10更新中,tkwebview2提供了have_runtime
和install_runtime
方法。
后续又在几位的评论以及电子邮寄的交流中发现将运行自动安装在D盘不妥,后来改为安装在程序目录下,用户点击确定关闭安装指引后删除安装文件,继续运行程序。这个更新在tkinter使用WebView2网页组件(续篇)_Smart-Space的博客-CSDN博客_tkinter webview的2022-6-25更新中说明。
这里,再次感谢crestgod的发现和蔡森森(蔡森森的博客_CSDN博客)的建议。
直接使用WebView2控件
这是我目前实现的最好的tkinter网页控件!
绕开窗口,直接使用基于WinForms的WebView2,可以直接在(STA模式下)tkinter窗口或者任意控件中创建WebView2控件。
这相当于tkwebview2的一次大升级,解决了诸多问题。该方法于2022年6月11日10:41:40发布在tkinter使用WebView2网页组件(续篇)_Smart-Space的博客-CSDN博客_tkinter webview。
持续维护
目前,虽然tkwebview2的更新频率比不上我的TinUI,但是我还是会偶尔碰一下它的。。。
比如添加新增Core初始化完成事件回调等等。
相关问题解决
目前,tkwebview2也会出现一些小问题,或者说缺乏示例。在Github上,tkwebview2(GitHub - tkwebview2)的test目录中,就包含了这些测试内容,其中就包括输入框焦点问题的解决。
使用tkwebview2的例子
我的TinGroup项目
其中,TinEngine渲染<html>
标签、百度百科搜索、在线简易HTML可视化创作,都是用了我自己的tkwebview2。
作为python库被收录
目前,tkwebview2被Package Galaxy(tkwebview2 python)、release-monitoring(tkwebview2 · Anitya)和Libraries(tkwebview2 3.2.0 on PyPI - Libraries.io)等作为python拓展库收录。
tkinter uses WebView2 web components中为tkwebview2介绍提供了英文版本。
其他使用者以及他们的项目
Easy PyPI
Easy PyPI V1.3.0发布!反馈、帮助功能上线了! - 真_人工智障 - 博客园中,作者使用tkwebview2来显示网页,创建了以网络商店形式的pip控制应用。
Small tool
Small tool 2.0 update! - Programmer All中,作者使用tkwebview2为主要控件开发一些小控件。
wjw的示例
Python Gui 初探(一)tkinter多页面切换 - wjw的blog里,同样使用了tkwebview2。
地图控件
tkinter 显示高德地图_qq_44719402的博客-CSDN博客_tkinter地图中,使用tkwebview2显示地图,可以开发为地图控件。
TkWebPage
TkWebPage · PyPI中,作者提供了多种在tkinter中创建网页浏览组件的控件,包括了tkinterie和tkwebview2。这位作者也为tkwebview2的runtime下载提供了建议。
感受
有点小成就感。-。-
结语
关于tkwebview2什么时候结束,毕竟我不可能一直维护下去,这是由需要tkwebview2的人所决定的。tkwebview2已经使用MIT开源,任何人均可以完善tkwebview2。
总之,tkwebview2的诞生经历了很多挫折。三年前(2019年以前),在网络上搜索“tkinter显示网页”或者相关内容,搜过的朋友一定会记得,那时的搜索结果要么毫不相关,要么没有帮助,要么难以实现,要么太老旧看不懂。
现在,搜索同样的内容,tkinter终于能够显示网页了。
tkinter爱好者的共同努力,造就了这一番景象。
【笔记】
边栏推荐
猜你喜欢
随机推荐
Power button 206 - reverse list - the list
Go语言为任意类型添加方法
ES6 - Arrow Functions
第三方验收测试报告有什么作用?如何获取权威软件测试报告?
(十六)51单片机——红外遥控
Solidity智能合约开发 — 4.1-合约创建和函数修饰器
leetcode 1837. The sum of the digits in the K-base representation
8.3模拟赛总结
leetcode 16. 数值的整数次方(快速幂+递归/迭代)
tRNA-m5C转运RNA(tRNA)修饰5-甲基胞嘧啶(m5C)|tRNA修饰m1Am2A (2-methyladenosine)
glusterfs 搭建使用
Node version switching tool NVM and npm source manager nrm
Likou 707 - Design Linked List - Linked List
leetcode 268. Missing Numbers (XOR!!)
【飞控开发高级教程6】疯壳·开源编队无人机-AI语音控制
EasyCVR平台海康摄像头语音对讲功能配置的3个注意事项
【飞控开发高级教程4】疯壳·开源编队无人机-360 度翻滚
收藏-即时通讯(IM)开源项目OpenIM-功能手册
使用 ReportLab 绘制 PDF
RNA核糖核酸修饰Alexa 568/[email protected] 594/[email prote