前言

tkinter嵌入网页,是一个难题,但办法总比困难多,这里我总结出5种

CEFPython(win&mac&lin)

三系统通用,tkinter绑定详见以前的文章,这应该是最活跃的了。Github,PYPI

Miniblink(暂win)

知乎大神扫地僧的作品,官网,PYPI上有MBPython来调用
pip install MBPython

import tkinter as tk
from MBPython import *
MB_PATH=None
MB=None
def setup(path="miniblink_x64.dll",):
    global MB_PATH,MB
    MB_PATH=path
    MB=miniblink.Miniblink.init(MB_PATH)
    if not tk._default_root:
        return -1
    return 0
class Webview(tk.Frame):
    def __init__(self,*a,url=None,cancookie=1,cookie=".",**b):
        super().__init__(*a,**b)
        self.wke=wke=miniblink.Miniblink(MB)
        self.web=web=wke.window.wkeCreateWebWindow(2,self.winfo_id(),1,1,0,0)
        self.bind("<Configure>",self._onResize)
        self._fixsize()
        MB.wkeSetCookieEnabled(cancookie)
        MB.wkeSetCookieJarFullPath(self.web,cookie)
        if url:
            self.loadURL(url)
        wke.window.wkeShowWindow(self.web)
        self._bind_functions()
    def loadURL(self,url):
        MB.wkeLoadURLW(self.web,str(url))
    lu=loadurl=loadURL
    def _onResize(self,event=None):
        res=self.event_generate("<<Configure>>")
        if res=="break":
            return
        self._fixsize()
    def _fixsize(self):
        width=self.winfo_width()
        height=self.winfo_height()
        MB.wkeResize(self.web,width,height)
    def _bind_functions(self):
        attrs=((("reload","rl"),"wkeReload"),(("forward","fd"),"wkeGoForward"),(("back","bd"),"wkeGoBack"),(("getURL","geturl"),"wkeGetURL"))
        for attr in attrs:
            for a in attr[0]:
                setattr(self,a,(lambda self=self,attr=attr[1]:getattr(MB,attr)(self.web)))
    def getSURL(self):
        return self.getURL().decode()
    getsurl=getSURL
    @property
    def url(self):return self.getsurl()
    @url.setter
    def url(self,new):self.loadURL(new)
    @property
    def surl(self):return self.getsurl()
    @url.setter
    def surl(self,new):self.loadURL(new)
def test():
    def update():
        var.set(web.getSURL()[:80]+"~~~~~~")
        root.after(100,update)
    root=tk.Tk()
    root.geometry("800x600")
    root.title("Webview Test through miniblink")
    setup("x64.dll")
    toolbar=tk.Frame()
    toolbar.pack(side="top",fill="x")
    web=Webview(url="https://www.baidu.com")
    web.pack(expand=1,fill="both")
    var=tk.StringVar()
    tk.Button(toolbar,text="Back",command=web.back).pack(side="left")
    tk.Button(toolbar,text="Forward",command=web.forward).pack(side="left")
    tk.Button(toolbar,text="Reload",command=web.reload).pack(side="left")
    tk.Button(toolbar,text="Baidu",command=lambda:web.loadurl("https://www.baidu.com")).pack(side="left")
    tk.Button(toolbar,text="Miniblink",command=lambda:web.loadurl("https://miniblink.net")).pack(side="left")
    tk.Label(toolbar,textvariable=var).pack(side="left")
    update()
    root.mainloop()
if __name__=="__main__":
    test()

tkinterie和tkwebview2(Win)

Smart-space的作品,

只放上链接,因为人家的文章好像是要关注才能看的。。。。。。
但以上两个模块可以直接pip,有兴趣的可以折腾折腾

不靠谱:selenium(win&mac&lin)

如果你有足够的头发,可以试试,我只给出思路

  1. 用selenium打开一个浏览器(无头)
  2. 截图,放到Canvas上
  3. 把Canvas的事件传递给selenium
  4. 回到 步骤2

只是我还没想到输入框怎么办。。。

不靠谱:tkinterweb

pip install tkinterweb

import tkinterweb as th3
import tkinter as tk
root = tk.Tk()
frame = th3.HtmlFrame(root)
frame.pack()
frame.load_website("pypi.org")
root.mainloop()

这个可以加载自己的html,本地的html,等等,支持css
还可以自己编写事件
等等,这听上去挺靠谱的啊!
因为,它
不支持JS!
不支持脚本!
不支持JavaScript!
这是一个2005年的项目,smart-space的文章里不是也说了么,IE4风格
但是我认为,这个东西只有1MB,写“帮助文档”或“彩色提示”这种东西还是绰绰有余的,也不能说是一无是处吧。。。

总结

这5种方法,适合处如下:

方法场景
CEFPython3想要全功能的
Miniblink想要小体积且对视频没要求的
tkwebview2对体积或捆绑要求非常严格且只需要win的
selenium阳寿比较足的
tkinterweb显示彩色文档的

自己选吧
本文发与CSDN与2022/1/15 16:56

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐