【问题标题】:Setting frames on tkinter with cef使用 cef 在 tkinter 上设置帧
【发布时间】:2021-09-02 13:51:24
【问题描述】:

有人可以帮忙吗?

我的页面是用框架定义的,但是当我运行代码时它只显示浏览器窗口。

此问题是Load CEF in labelframe的延续

它基本上是一个带有链接的窗口和右侧的浏览器窗口

import ctypes
import platform
import sys
import tkinter as tk
from cefpython3 import cefpython as cef
from tkinter import ttk
import tkinter as tk

import requests
from bs4 import BeautifulSoup
import webbrowser
import tkinterweb

global urlset
urlset="https://www.google.com"

# platforms
WINDOWS = platform.system() == 'Windows'
LINUX = platform.system() == 'Linux'
MAC = platform.system() == 'Darwin'

class BrowserFrame(tk.Frame):
    def __init__(self, master=None, **kw):
        super().__init__(master, **kw)
        self.browser = None
        self.bind('<Configure>', self.on_configure)

    def open(self, url):
        if self.browser:
            self.browser.LoadUrl(url)

    # inside BrowserFrame
    def on_configure(self, event):
        if self.browser is None:
            self.browser = cef.CreateBrowserSync(cef_winfo,url=urlset)


    def get_window_handle(self):
        if MAC:
            from AppKit import NSApp
            import objc
            return objc.pyobjc_id(NSApp.windows()[-1].contentView())
        elif self.winfo_id() > 0:
            return self.winfo_id()
        else:
            raise Exception('Could not obtain window handle!')

    def on_configure(self, event):
        if self.browser is None:
            # create the browser and embed it in current frame
            rect = [0, 0, self.winfo_width(), self.winfo_height()]
            cef_winfo = cef.WindowInfo()
            win_id = self.get_window_handle()
            cef_winfo.SetAsChild(win_id, rect)
            self.browser = cef.CreateBrowserSync(cef_winfo, url=urlset)

            # start the browser handling loop
            self.cef_loop()

        # resize the browser
        if WINDOWS:
            ctypes.windll.user32.SetWindowPos(
                self.browser.GetWindowHandle(), 0,
                0, 0, event.width, event.height, 0x0002)
        elif LINUX:
            self.browser.SetBounds(0, 0, event.width, event.height)

    def cef_loop(self):
        cef.MessageLoopWork()
        self.after(10, self.cef_loop)


def main():

    sys.excepthook = cef.ExceptHook  # To shutdown all CEF processes on error

    root = tk.Tk()
    w, h = root.winfo_screenwidth(), root.winfo_screenheight()
    root.geometry("%dx%d+0+0" % (w, h))
    root.title('Test')

    settings = {}
    if MAC:
        settings["external_message_pump"] = True

    cef.Initialize(settings=settings)

    container = ttk.Frame(root)
    canvas = tk.Canvas(container)
    scrollbar_x = ttk.Scrollbar(container, orient="horizontal", command=canvas.xview)
    scrollbar_y = ttk.Scrollbar(container, orient="vertical", command=canvas.yview)
    scrollable_frame = ttk.Frame(canvas)

    scrollable_frame.bind("<Configure>", lambda e: canvas.configure(scrollregion=canvas.bbox("all")))

    canvas.create_window((0, 0), window=scrollable_frame, anchor="nw")

    canvas.configure(xscrollcommand=scrollbar_x.set)
    canvas.configure(yscrollcommand=scrollbar_y.set)

    stathomelib = tk.LabelFrame(scrollable_frame, text="Library", padx=5, pady=5, highlightbackground="black",
                             highlightthickness=2)
    stathomelib.grid(row=3, column=0, columnspan=2, sticky="NW", pady=2)

    stathomedoc = tk.LabelFrame(scrollable_frame, text="Documentation", padx=5, pady=5, highlightbackground="black",
                             highlightthickness=2)
    stathomedoc.grid(row=3, column=2, columnspan=2, sticky="NW", pady=2)

    home_browser = tk.LabelFrame(scrollable_frame, text="", padx=5, pady=5, highlightbackground="black", highlightthickness=2)
    home_browser.grid(row=0, column=99, rowspan=99, sticky='ne', pady=2)

    valido_browser = tk.IntVar()
    valido_browser.set(False)
    checkbrowser = tk.Checkbutton(home_browser, fg="blue", selectcolor="red", text="Open in Browser",variable=valido_browser)
    checkbrowser.grid(row=0, column=0, columnspan=9, sticky="wn")


    # specify initial width and height
    browser = BrowserFrame(home_browser, width=1200, height=700)
    browser.grid(row=2, column=0, columnspan=9, sticky="wn")

    def choose_browser(urlbook):
        if valido_browser.get() == 1:
            webbrowser.open(urlbook)
        else:
            browser.open(urlbook)



    global varLnkOrder
    varLnkOrder = ""
    varLbook = open("Confs/bookmarks.txt", "r").readlines()
    try:
        for line in varLbook:
            undef = ""
            if ":stathomelib" in line:
                varLnkOrder = stathomelib
                taman = 43
                c = 0
                i = 0

            elif ":stathomedoc" in line:
                varLnkOrder = stathomedoc
                taman = 43
                c = 0
                i = 0



            if len(line) > 1:

                titul, urlbook = line.split('<=>')
                if len(titul) > 1:
                    link1 = tk.Label(varLnkOrder, width=taman, text=titul + str(undef), justify="left", anchor="center",
                                     fg="blue", cursor="draft_large")
                    link1.grid(row=i, column=c, sticky="n", pady=2)
                    link1.bind("<Button-1>", lambda e, urlbook=urlbook: choose_browser(urlbook.rstrip()))
                    i += 1
                    line == ""

    except Exception as e:
        from main import log_error
        log_error(e, "Bookmark_Builder")

    container.pack(expand=1, fill="both")
    scrollbar_x.pack(side="bottom", fill="x")
    scrollbar_y.pack(side="right", fill="y")
    canvas.pack(side="bottom", fill="both", expand=True)

    root.mainloop()
if __name__ == '__main__':
    main()

书签.txt

:stathomelib aaaaswefdeeryweryfgertgjhslkrghkjreshjglkjhlksghklrhsklrhklegrthuyug aaaaswefdeeryweryfgertgjhslkrghkjreshjglkjhlksghklrhsklrhklegrthuyug/ aaaaswefdeeryweryfgertgjhslkrghkjreshjglkjhlksghklrhsklrhklegrth

:stathomedoc Wiki Teltonika 命令https://wiki.teltonika-gps.com/view/FMB_SMS/GPRS_Commands Lucene 查询语法(LogTrail 搜索)http://www.lucenetutorial.com/lucene-query-syntax.html aaaaswefdeeryweryfgertgjhslkrghkjreshjglkjhlksghklrhsklrhklegrthuyug/ aaaaswefdeeryweryfgertgjhslkrghkjreshjglkjhlksghklrhsklrhklegrthuyug/ aaaaswefdeeryweryfgertgjhslkrghkjreshjglkjhlksghklrhsklrhklegrthuyug/

:stathome工具 aaaaswefdeeryweryfgertgjhslkrghkjreshjglkjhlksghklrhsklrhklegrthuyug/ aaaaswefdeeryweryfgertgjhslkrghkjreshjglkjhlksghklrhsklrhklegrthuyug/

【问题讨论】:

  • 你能发一个minimal reproducible example吗?我认为你现在的代码太多了。
  • 当然,更新了我的代码
  • 我没有看到任何使用嵌入式 CEF 浏览器加载所选 URL 的代码。 choose_browser() 将使用外部浏览器 (webbrowser) 或 tkinterweb.HtmlFrame
  • acw1668 请再查看

标签: python python-3.x tkinter chromium-embedded


【解决方案1】:

请注意,更新urlset 不会自动在 CEF 浏览器中加载 URL。你需要在BrowserFrame中创建一个函数来加载一个URL:

# inside BrowserFrame
def open(self, url):
    if self.browser:
        self.browser.LoadUrl(url)

并且在创建CEF浏览器的时候需要加载一个默认的URL:

# inside BrowserFrame
def on_configure(self, event):
    if self.browser is None:
        ...
        self.browser = cef.CreateBrowserSync(cef_winfo,
                                             url="https://www.google.com")
    ...

然后更新main()如下:

def main():
    ...
    # specify initial width and height
    browser = BrowserFrame(home_browser, width=1200, height=700)
    browser.grid(row=2, column=0, columnspan=9, sticky="wn")

    def choose_browser(urlbook):
        if valido_browser.get() == 1:
            webbrowser.open(urlbook)
        else:
            browser.open(urlbook)

    # not necessary to call choose_browser() here
    #choose_browser("http://www.google.com")
    ...

不建议导入如下相同的模块:

from tkinter import *
import tkinter as tk

最好只使用后者。

【讨论】:

  • 没有工作:(它打开但说(RuntimeError:主线程不在主循环中)。用你的更新更新了问题
  • @scl.raz 我已经测试了我的更改并且它有效。此外,我的更改与线程无关,所以我不/想知道您为什么会出现这样的错误。
  • 你看我是否在我的例子中正确地组装了代码?你能把你的发给我或检查我是否做对了吗?谢谢
  • 我只是使用您更新的代码(删除了未使用的导入)并且它可以工作。代码参考here
  • pastebin.com/VmW32LhY 尝试了您的示例,它打开了一个空的浏览器窗口(@98​​7654323@),奇怪的是它适用于您而不是我。会不会是mac问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-03
  • 2017-07-09
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-20
相关资源
最近更新 更多