[嵌入网页] 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的作品,

只放上链接,因为人家的文章好像是要关注才能看的。。。。。。
但以上两个模块可以直接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

  • 7
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: Matplotlib可以嵌入Tkinter,实现在Tkinter窗口中显示Matplotlib图形。具体步骤如下: 1. 导入Tkinter和Matplotlib库 2. 创建Tkinter窗口 3. 创建Matplotlib图形 4. 将Matplotlib图形嵌入Tkinter窗口中 5. 运行Tkinter主循环 示例代码如下: ```python import tkinter as tk from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg from matplotlib.figure import Figure # 创建Tkinter窗口 root = tk.Tk() root.title("Matplotlib in Tkinter") # 创建Matplotlib图形 fig = Figure(figsize=(5, 4), dpi=100) ax = fig.add_subplot(111) ax.plot([1, 2, 3, 4, 5], [2, 3, 5, 4, 6]) # 将Matplotlib图形嵌入Tkinter窗口中 canvas = FigureCanvasTkAgg(fig, master=root) canvas.draw() canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1) # 运行Tkinter主循环 tk.mainloop() ``` 运行以上代码,即可在Tkinter窗口中显示Matplotlib图形。 ### 回答2: Matplotlib是一个非常强大的Python绘图库,它可以用来绘制各图形,包括折线图、散点图、饼图、直方图等等。而TkinterPython自带的一个GUI库,可以用来创建GUI应用程序,包括窗口、按钮、标签和文本框等等。 在Python中,我们可以将Matplotlib集成到Tkinter应用程序中,实现可视化图形的交互。这个过程中需要使用到Matplotlib的子模块TkAgg(TkAgg:Tcl/Tk Agg backend,是指将Matplotlib绘制的图形放置在Tkinter应用程序的Canvas组件中)及matplotlib.backends.backend_tkagg。 具体实现步骤如下: 1. 导入相关库,包括Matplotlib、Tkinter和numpy。 2. 建立main窗口。 3. 创建一个matplotlib图形,将其放置在Tkinter窗口中。 4. 启动Tkinter的事件循环,以响应控件的事件和用户的交互。 代码示例: ``` import tkinter as tk from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg from matplotlib.figure import Figure import numpy as np #建立主窗口 root = tk.Tk() root.title("Matplotlib Embedding in Tkinter") #建立一个1x1图形,并在其中添加subplot fig = Figure(figsize = (5, 5), dpi = 100) ax = fig.add_subplot(111) #生成100个随机数的Numpy数组 x = np.arange(0, 100) y = np.random.normal(0, 1, 100) #绘制图形 ax.plot(x, y) #创建一个Canvas并将其放置在Tkinter窗口中 canvas = FigureCanvasTkAgg(fig, master = root) canvas.draw() #将Canvas放置在Tkinter窗口中 canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1) #启动Tkinter事件循环 tk.mainloop() ``` 以上代码创建了一个主窗口,并在其中添加一个1x1的图形,用Numpy随机数绘制折线图。最后,将图形的Canvas放置在Tkinter窗口中,并启动Tkinter的事件循环,以响应用户的交互。 总体来说,Matplotlib嵌入Tkinter是一非常有用的技术,它使得我们可以在Tkinter应用程序中轻松地添加可视化图形,并快速地与用户进行交互。 ### 回答3: Matplotlib是一款强大的用于绘制图形的Python库,而Tkinter则是Python的标准GUI库。将这两者结合起来,可以在Tkinter应用程序中嵌入Matplotlib图形并将其显示出来。这对于需要实现数据可视化的应用程序非常有用。 使用Matplotlib嵌入Tkinter,需要使用FigureCanvasTkAgg类。该类可将Matplotlib图形绘制到Tkinter画布上。首先需要导入必要的模块: ```python import matplotlib import tkinter as tk from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg from matplotlib.figure import Figure ``` 然后,可以创建一个Tkinter窗口和一个Matplotlib图形,并将图形绘制到Tkinter画布上: ```python root = tk.Tk() root.title("Matplotlib with Tkinter") # 创建一个Matplotlib图形 fig = Figure(figsize=(5, 4), dpi=100) ax = fig.add_subplot(111) ax.plot([0,1,2,3,4],[10,1,20,3,40]) # 创建一个Tkinter画布,并将Matplotlib图形绘制到该画布上 canvas = FigureCanvasTkAgg(fig, master=root) canvas.draw() canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1) # 启动Tkinter事件循环 tk.mainloop() ``` 这段代码首先创建了一个Tkinter窗口,然后创建了一个Matplotlib图形并将其绘制到画布上。最后,启动了Tkinter事件循环,显示窗口和图形。 除了绘制图形,还可以通过将Matplotlib图形封装在Tkinter框架中来实现用户与图形的交互。例如,可以轻松地添加按钮和滑块来更改图形参数,并实时更新Matplotlib图形。这为定制化的绘图提供了极大的灵活性。 总之,Matplotlib嵌入TkinterPython中实现数据可视化的一强大的方法,通过将两种库结合起来,我们可以创建强大的应用程序来探索、分析和可视化数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值