基于 Win32Exts for Python 的 CEF 浏览器框架介绍
===============================================
在 Python 中使用 CEF 目前已有比较成熟的(虽然并不完善)的 cefpython 项目。
Win32Exts for Python 本着功能尽善尽美的原则,目前也支持 CEF 框架,
如果觉得 cefpython 项目依赖过多或者不能实现自己需求的话,可以考虑一下使用 Win32Exts 作为代替方案。
Win32Exts for Python 下载地址:
https://github.com/tankaishuai/win32exts_for_Python
(目前仅 x86 版本支持,请确保下载 32位的 Python, 2.x 或者 3.x 均可)
将 x86 版本的 win32exts.pyd 置于 Python 安装目录 /DLLs 下面,仅需此一个模块即可。
然后下载 CEF 框架的依赖 Dlls (libcef.dll 等),建议使用 CEF 49 内核,可以搜索【cef_binary_3.2623】自行下载,
或者从笔者 github 的项目地址上提取:
https://github.com/tankaishuai/WebBrowser_Wrapper
下载后将 CEF 框架的依赖 Dlls 也一并放入:Python 安装目录 /DLLs 下面,或者路径加入环境变量中。
以上如果实在不知道如何操作,可以直接下载笔者当前所用的 Python 2.7 x86 懒人包,解压缩就可直接食用:
链接: https://pan.baidu.com/s/1Do5JW0SpnE7TByLDMyNuUQ 提取码: 2xut
需要说明的是, Win32Exts 并不是专为 CEF 开发的一个项目,其涵盖功能极为丰富。对 CEF 的支持以导出的若干
以 cef_webview_****() 开头的接口实现。关于在 Python 中使用 Win32Exts 的基本用法,请参阅, 在此不谈:
Python 调用 Windows Win32 API COM 新法
以及笔者的其它博文。
github 项目上的 cef_webview_demo.py 文件为 CEF 的一个简单 demo, 下面简要介绍下具体用法:
1、首先需要初始化 win32exts 基本库:
import win32exts
win32exts.load_sym("*", "*")
2、创建cef对象:
hParent = None
init_url = None
cef = win32exts.cef_webview_createA("cef", hParent, x, y, width, height, init_url)
其中
(x, y, width, height) 四个参数指定了 webview 创建的具体位置,
当然后续也可以使用 win32exts.cef_webview_set_bounds() 修改之。
init_url 参数指定了加载的 url 地址,当然后续也可以使用 win32exts.cef_webview_load_urlA/W 接口加载 url。
3、cef初始化,指定事件通知函数:
ret = win32exts.cef_webview_init(cef, win32exts.callback("OnWebViewEvent"))
OnWebViewEvent 为指定的一个事件通知函数,其名称随意,函数格式为:
def OnWebViewEvent(args):
return "0, 0"
4、进入消息循环:
win32exts.cef_webview_message_loop()
5、释放 cef:
win32exts.cef_webview_destroy(cef)
整个基本框架大致如上。可见重点是事件通知函数的编写,一般来说, OnWebViewEvent()可以使用下述模板编写:
def OnWebViewEvent(args):
#取参数包
event = win32exts.read_wstring(win32exts.arg(args, 2))
status = win32exts.arg(args, 3)
param1 = win32exts.arg(args, 4)
if param1 > 0:
param1 = win32exts.read_wstring(param1)
param2 = win32exts.arg(args, 5)
if param2 > 0:
param2 = win32exts.read_wstring(param2)
print(event, status, param1, param2) #事件分流
if "OnViewCreated" == event:
OnViewCreated()
elif "OnViewDestroy" == event:
OnViewDestroy()
elif "OnDocumentReady" == event:
OnDocumentReady()
elif "OnLoadingFailed" == event:
OnLoadingFailed(param1, param2)
elif "OnUrlChanged" == event:
OnUrlChanged(param1)
elif "OnTitleChanged" == event:
OnTitleChanged(param1)
elif "OnNewView" == event:
OnNewView(param1)
elif "OnExecute" == event:
OnExecute(status, param1, param2)
elif "FreeResult" == event:
FreeResult(status)
elif "OnExecuteCallback" == event:
OnExecuteCallback(status, param1, param2)
return "0, 0"
至于具体更详细的用法,请参阅示例 github 上的示例 demo,
最后列出 Win32Exts 提供的 CEF 接口列表:
cef_webview_message_loop(pfnInit, pfnThreadWndProc, pfnTerm);
cef_webview_createW(engine_type, hParent, x, y, w, h, url, cmd);
cef_webview_createA(engine_type, hParent, x, y, w, h, url, cmd);
cef_webview_destroy(handle);
cef_webview_free_buffer(p);
cef_webview_init(handle, pfnHandler);
cef_webview_set_cookiesW(handle, url, cookie);
cef_webview_get_cookiesW(handle, url);
cef_webview_load_urlA(handle, url, cookie);
cef_webview_load_urlW(handle, url, cookie);
cef_webview_show(handle, bShow);
cef_webview_set_bounds(handle, x, y, width, height);
cef_webview_mute_volume(handle, bMute);
cef_webview_get_attrW(handle, key, pValue, pdwSize);
cef_webview_set_attrW(handle, key, pValue, dwSize);
cef_webview_get_attr_intW(handle, key);
cef_webview_set_attr_intW(handle, key, intValue);
cef_webview_get_attr_strW(handle, key);
cef_webview_set_attr_strW(handle, key, strValue);
cef_webview_get_attr_intA(handle, key);
cef_webview_set_attr_intA(handle, key, intValue);
cef_webview_get_attr_strA(handle, key);
cef_webview_set_attr_strA(handle, key, strValue);
cef_webview_execW(handle, szFunction, pfnHandler, dwTimeout, pszArgument1, ...);
cef_webview_execA(handle, szFunction, pfnHandler, dwTimeout, pszArgument1, ...);
cef_webview_exec_v2W(handle, szFunction, pfnHandler, pszArguments, dwArgumentCount, dwTimeout);
cef_webview_exec_v2A(handle, szFunction, pfnHandler, pszArguments, dwArgumentCount, dwTimeout);
cef_webview_cancel(handle, lExecId);
cef_webview_registerW(handle, szFunction, pfnHandler);
cef_webview_registerA(handle, szFunction, pfnHandler);
cef_webview_unregisterW(handle, szFunction);
cef_webview_unregisterA(handle, szFunction);
cef_webview_context_menuW(handle, uMenuId, szText, szStyle, szFunction);