基于 Win32Exts for Python 的 CEF 浏览器框架介绍

基于 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/1Do90R-yr77rpZmVYGM0NFA 
             提取码:sr27 

     需要说明的是, Win32Exts 并不是专为 CEF 开发的一个项目,其涵盖功能极为丰富。对 CEF 的支持以导出的若干

cef_webview_****() 开头的接口实现。关于在 Python 中使用 Win32Exts 的基本用法,请参阅, 在此不谈:

     Python 调用 Windows Win32 API COM 新法

    https://blog.csdn.net/tan_kaishuai/article/details/97893739

    以及笔者的其它博文。

   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);

              

      

原创文章 17 获赞 7 访问量 4655

猜你喜欢

转载自blog.csdn.net/tan_kaishuai/article/details/105322087
CEF