如何调用cef.CreateBrowserSync()?cefpython3结合tkinter报UI线程错误如何解决
cefpython UI线程定义及报错排查
UI线程的具体定义
在cefpython+tkinter的技术栈语境下,UI线程指的是你初始化并启动tkinter主事件循环的线程,同时也是执行cef.Initialize()初始化操作的线程。
CEF底层采用多进程多线程架构,为了避免跨线程操作GUI资源引发的竞态条件、渲染崩溃、消息丢失等问题,所有和浏览器控件创建、界面交互、消息处理相关的API,都必须在和系统GUI事件循环绑定的同一个线程中调用,这个线程就是官方文档所说的UI线程。
该报错的常见触发原因
AssertionError: cefpython.CreateBrowserSync() may only be called on the UI thread报错通常是以下操作导致的:
- 将
CreateBrowserSync()调用逻辑放在了子线程、异步回调函数中执行,没有和tkinter主循环在同一个线程 cef.Initialize()初始化操作和tk.Tk()实例化操作分别在不同的线程执行,两个框架的事件循环没有绑定到同一个线程- 在tkinter控件还未完成初始化挂载的时候,就提前触发了浏览器创建逻辑
通用修复方案
- 保证
cef.Initialize()、tk.Tk()实例化、CreateBrowserSync()三个操作都在Python主线程中执行,不要将上述逻辑放到子线程任务中 - 如果需要等待其他资源加载完成后再创建浏览器,通过tkinter内置的
after()方法将浏览器创建逻辑调度回主事件循环线程执行,不要在异步任务中直接调用浏览器创建接口
内容的提问来源于stack exchange,提问作者LukeDev
相关产品推荐
相关产品推荐

