[嵌入网页] tkinter嵌入网页的5种方式(两种不靠谱)
文章目录
- 前言
- CEFPython(win&mac&lin)
- Miniblink(暂win)
- tkinterie和tkwebview2(Win)
- 不靠谱:selenium(win&mac&lin)
- 不靠谱:tkinterweb
- 总结
前言
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,MBMB_PATH=pathMB=miniblink.Miniblink.init(MB_PATH)if not tk._default_root:return -1return 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("" ,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=loadURLdef _onResize(self,event=None):res=self.event_generate("<>" )if res=="break":returnself._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@propertydef url(self):return self.getsurl()@url.setterdef url(self,new):self.loadURL(new)@propertydef surl(self):return self.getsurl()@url.setterdef 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的作品,
- tkinter中嵌入IE的tkinterie
- 调用MS组件的tkwebview2
只放上链接,因为人家的文章好像是要关注才能看的。。。。。。
但以上两个模块可以直接pip,有兴趣的可以折腾折腾
不靠谱:selenium(win&mac&lin)
如果你有足够的头发,可以试试,我只给出思路
- 用selenium打开一个浏览器(无头)
- 截图,放到Canvas上
- 把Canvas的事件传递给selenium
- 回到 步骤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
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
