tkinter的webview视图。
在此之前,我在Windows平台上实现了Smart-Space/tkwebview2,但是为了使用WebView2,需要pywebview和pythonnet,而且有大量的底层操作包含在库源码中。
显然,直接使用c/c++封装给python使用会更简单。感谢webview/webview和HIllya51/webviewpy,让这个想法成为可能。
Important
tkwebview当前不包含事件回调,但是拥有了十分重要的javascript调用python代码的功能。此外,因为经过封装,tkwebview难以操作原始的web控件,但也因此非常简单易用。
Warning
虽然webview是跨平台的,但是原始的set_size无法满足嵌入状态下的尺寸修改,需要实现新的函数,并且为了方便,我单独维护了一个基于webview的c++库Smart-Space/webview,这个库的核心部件截止于HIllya51/webviewpy@e81bd17,如果没有严重错误,不会更新。
由于条件限制,本仓库只能提供的Windows平台的二进制链接库(32位链接库未经过测试)。
pip install tkwebview示例程序见:../tkwebview/test.py
tkwebview的核心类,本质上是一个Frame,可以和Frame布局。
如果master为None,将独立打开一个webview窗口,使用类似webviewpy,但如果要独立运行,需要使用tkwebview.webview.run()开启UI循环。
绑定名为name的JS函数,指向fn。在JavaScript中,使用window.name调用。
在同步模式中,fn只需要接收JS函数传递来的参数,返回结果即可。
异步模式中,fn至少会收到一个returner函数(第一个参数位),异步处理得到结果后,通过returner(result)返回结果。
子线程中调度代码在主线程/GUI上运行(我也没看懂)。
解除绑定名为name的JS函数。
执行JS代码。
导航到url。
Note
url需要以协议开头,包括http, https, file...
在开头注入JS代码,比任何内容都要前。
设置html代码。
返回webview/webview的版本。
Windows Only
重新加载。
Windows Only
向后一页。
Windows Only
向前一页。
Windows Only
停止加载。
独立模式
设置窗口标题。
独立模式
关闭webview窗口。
控件模式
销毁本控件
独立模式
返回窗口ID。
- Windows:HWND
- Linux:GtkWindow指针
- Cocoa:NSWindow指针
控件模式
返回上层组件ID。
- Windows:HWND
- Linux:X11窗口标识
独立模式
设置窗口大小。
控件模式
尝试修改控件大小。
Caution
Windows平台下,不知原因,tkinter界面中,WebView2具有最高级渲染优先级,一旦获得焦点,除非离开整个窗口,否则其它控件无法获取焦点。解决方法是为所有控件绑定<Button-1>使用event.widget.focus_force()强制获取焦点。如果有控件还需要额外绑定<Button-1>事件,使用add参数。
下载Smart-Space/webview,编译需要的版本,得到动态链接库。
我只实现了Windows平台下的
webview_resize。
下载本仓库代码,将动态链接库放置在.tkwebview/platform下正确的位置(见./tkwebview/core.py)。
理论上,tkwebview完全能够跨平台,但是我测试不了,所以只提供Windows平台的二进制链接库。所有的跨平台代码应当在webview中编写,本库只提供统一封装。