cefpython和tkinter的消息循环如何共存

博客作者解决了在Tkinter UI程序中同时运行CEFPython预览的问题。他们创建了一个while循环,通过root.update处理Tkinter消息,用cef.MessageLoopWork处理CEF消息。当出现错误时,程序优雅地退出并清理资源。此外,还提供了一个将文本转换为网页预览的功能。
摘要由CSDN通过智能技术生成

cefpython和tkinter的消息循环如何共存

问题起源

本人想做一个tkinter UI界面的程序,里面可以写代码,写好代码以后,利用cefpython来预览,但是搜寻众多资料,发现root.mainloop和cef的MainLoop不能共存于同一个进程中,当然可以使用另外的进程来维护cef。遗憾的是双进程程序,一来消息传递非常麻烦,二来发现tkinter上的控件不能获得焦点,text控件无法接收输入。如是想着怎么自己写个消息循环来实现两者的共存。于是本文诞生。

解决方案

当我想出方案以后发现其实,代码很简单。诸君且看:

if __name__ == '__main__':
    root = Tk()
    root.title('myIDE')
    root.geometry("800x760")
    #root.protocol('WM_DELETE_WINDOW', on_closing)
    frame1 = Frame(root, bg='gray', height=400)
    frame1.pack(side=TOP, fill=X)
    frame2 = Frame(root, bg='white', height=200)
    frame2.pack(side=TOP, fill=X)
    rect = [0, 0, 800, 400]
    #thread = threading.Thread(target=embed_browser_thread, args=(frame1, rect),daemon=True)
    #thread.start()
    br=embed_browser_thread(frame1,rect)
    #root.update_idletasks(cef.MessageLoopWork)#after_idle(cef.MessageLoopWork)
    text = Text(frame2)
    text.pack(fill='both',expand=YES)
    Button(root,text='run',command=lambda:preview(text.get(0.0,END))).pack()
    while True:
        try:
            root.update()
        except Exception as e:
            #print(e)
            break
        try:
            cef.MessageLoopWork()
        except  Exception as e:
            #print(e)
            break
        time.sleep(0.01)
    try:
        root.destroy()
    except:
        pass
    try:
        cef.Shutdown()
    except:
        pass
    #root.mainloop()

通过一个while循环来实现消息处理,通过root.update 实现root的消息处理,通过cef的MessageLoopWork实现了cef的消息处理。当出错时,说明root或者cef被销毁了,这时候跳出循环。然后执行后面的destroy或者shutdown动作。问题解决!!
其中:

def embed_browser_thread(frame, _rect):
    sys.excepthook = cef.ExceptHook
    window_info = cef.WindowInfo(frame.winfo_id())
    window_info.SetAsChild(frame.winfo_id(), _rect)
    cef.Initialize()
    br=cef.CreateBrowserSync(window_info, url='http://www.baidu.com')
    return br

题外话

本人所写程序中另外一个函数preview是将text中的文本转换成网页,然后写到本地,然后用br来加载预览。如果感兴趣可以联系我。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值