tkinter浏览器组件

引言

当然,tkinter原生的核心组件并没有浏览器组件,这是使得tkinter与wxpython和PYQT的差距非常大的原因之一。为了使tkinter窗口能够显示网页,很多人都为tkinter提供了配套绑定的浏览器组件==(注意是浏览器组件,不是html富文本框)==。以下是比较常用的方法或者绑定:

  • tkinterhtml(TkHtml的Python绑定,过时很久了,HTML4的风格,但tkinterweb做得挺好)
  • TkHtml(tkinter的浏览器组件dll拓展,也是比较过时的)
  • HV3(tkinter的浏览器组件dll拓展,与TkHtml配合使用,现代外观,但依旧比较老)
  • cefpython(Python的谷歌绑定,保持更新,但体积大)

那么我们怎么样才能够做到拥有现在外观,体积小巧的浏览器组件呢?

构思

tcl方面

我们知道,tkinter是对tcl/tk的绑定,如果我们在tcl组件中加入浏览器拓展组件,问题就解决了。但是,这种方法编写复杂,不易成功,而且就目前使用在tcl的浏览器拓展,效果都与现代外观浏览器差距甚远。

dll方面

使用系统ie组件或 edgehtml.dll 等dll拓展或许是一个不错的方法。但是结构是这样的:先用Python注册和使用dll的函数,再将效果传入tcl……这明显,超出实力范围了……

嵌入窗口!

这是集简单、高效、美观为一体的方法——嵌入外部浏览器窗口。很多GUI语言都自带浏览器组件使用方法,将这些代码编译成exe文件后,再将文件显示在需要显示的frame中,就成了tkinter的浏览器组件。

创建浏览器窗口

注意!!!,这一段内容必不可少,因为tkinter显示网页确实需要外部程序的支持!!!

语言选择

为了方便,选择 aardio语言,这个语言带有拓展GUI界面和快捷的智能提示(国人开发的)。

创建窗口

这里直接给出 aardio 代码:

import win.ui.minmax;
import win.ui;
import win.image;
import web.form;
/*DSG{{*/
mainForm = win.form(text="HtmlShow";left=0;top=0;right=895;bottom=700;border="thin";minimize=1;mode="popup";title=false)
mainForm.add()
/*}}*/

Path=io._exedir

win.ui.minmax(mainForm)

var wb=web.form(mainForm)
wb.noScriptErr=true;

arg=_CMDLINE
if (arg!=null){
    wb.go(arg)
}else {
    wb.go("\res\NoneHtml.html")//这行可以省略,没必要,测试时使用
}

wb.NewWindow3 = function(ppDisp,cancel,dwFlags,bstrUrlContext,bstrUrl ) { 
    wb.go(bstrUrl)
    return ppDisp,true;
};


mainForm.show();
return win.loopMessage();

思路就是创建细边框、无标题栏的弹出式窗口,然后最小化,使用时避免视觉干扰。最后,发布成exe文件。

嵌入窗口

在这我之前的一篇文章中,讲述了如何用 win32gui 在tkinter窗口中嵌入外部窗口。如果忘记或不知道,请到我的“tkinter实验”专栏中查找“tkinter创建真正的子窗口”。这里再次说明,我的那篇文章的方法,不仅可以嵌入tkinter窗口,还可以嵌入任何一个exe窗口(UPW应用不太稳定)。

首先,明白exe窗口标题(虽然没有标题栏)为“HtmlShow”,其次,将exe文件放入一个目录中,并且使用绝对路径。

现在我们来编写代码:

from subprocess import Popen
from tkinter import *#为了方便,一般不建议使用
import win32gui
from time import sleep as slp

resultframe=Frame(master)#创建frame
###using exe
#Popen必须是完整路径(绝对路径),url为网址
Popen([TinPath+'\\data\\bin\\HtmlShow.exe',url])
slp(1)#等待窗口创建
hid=win32gui.FindWindow(None,u"HtmlShow")#获取窗口句柄
win32gui.SetParent(hid,resultframe.winfo_id())#显示窗口

思路和原因,在注释已经说明了,这里就不再解释。
TinPath为该程序的运行目录,我将生成的HtmlShow.exe放在这个目录的\data\bin\下

注意到外部窗口的大小已经设定好,如果想要覆盖整个frame,还可以调整外部窗口大小或者使用win32gui.ShowWindow(hid,win32con.SW_MAXIMIZE)

效果如下:

在这里插入图片描述
Tin知识库


新的tkinter浏览器组件:2021-8-10更新

通过对tkinter浏览器组件各种实现的研究中,我编写了新的tkinter拓展——tkinterie,该模块通过com调用系统IEFrame,启动webview组件,为tkinter窗口提供一个webview组件。
目前该模块已被我上传至pypi,通过pip install tkinterie安装。

2021-8-16更新:使用tkinterie必须保证IE的com接口可以正常访问,也要保证有ieframe.dll,若不能使用就放弃tkinterie。

tkinterie的简单使用:2021-8-16更新

通过pip安装tkinterie模块后,使用如下代码,可以显示HTML5元素。

注意是渲染HTML5元素,并不是一个完整的浏览器。

from tkinter import *
from tkinterie.tkinterIE import WebView

a=Tk()
a.geometry('700x500+100+100')

w=WebView(a,500,500,'www.baidu.com')
w.pack(expand=True,fill='both')

a.mainloop()

效果如下:
在这里插入图片描述

tkinterIE的功能:2021-8-16更新

  • 渲染HTML5元素以及css设计(网页或文件)
  • 运行JavaScript(网页或文件)
  • 提供的WebView组件可以像正常tkinter组件一样非自动或自动调整尺寸
  • 多线程使用(使用过程中可能会报错,但不影响使用)
  • 嵌入到tkinter的Canvas和Text(若被半遮蔽可能报错,但不影响使用)
  • 点击新窗口链接在本地打开
  • 在程序内渲染HTML5元素等网页内容
  • 自主限制edge自动打开

新的tkinter网页组件:2021-12-25更新

为了解决IE即将寿终正寝,而且在Python中的支持不佳的问题,我基于pythonnet和pywebview写了新的tkinter网页组件——tkwebview2。这将允许tkinter使用Windows提供的WebView2。
具体文章

tkinterie使用新API:2022-4-9更新

考虑到之后无法直接使用InternetExplorer.Application,现在最新版的tkinterie(-1.4.0-)不再使用comtypes,而是使用pythonnet,通过 .Net 使用WinForms框架创建WebBrowser组件。

新版的tkinter有以下好处:

  1. 与tkinter窗口紧密耦合
  2. 可以直接操作WinForms.WebBrowser,如获取属性、执行方法、绑定网页控件自身事件
  3. 99%可操作度

当然,有以下两个前提:

  1. 读得懂https://docs.microsoft.com/zh-cn/dotnet/api/?view=netframework-4.8&term=webbrow中的内容
  2. tkinter窗口必须在STA线程模式下运行,具体见说明

在这里插入图片描述

tkinterie小改进:2022-6-18

添加了一些基础方法:刷新、前一页、下一页、搜索界面等。


结语

看完这篇文章,相信你对tkinter的使用更上一层楼,tkinter还可以实现更多功能,这等待我们来探索。怎么样,不如现在试试?

使用pip下载:

pip install tkinterie

☀tkinter创新☀

  • 16
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 44
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 44
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值