[嵌入网页] tkinter嵌入网页的5种方式(两种不靠谱)
在tkinter中显示网页,有5种方法
·
文章目录
前言
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的作品,
- 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
更多推荐
已为社区贡献1条内容
所有评论(0)