Kivy Garden - 多个Chromium嵌入式浏览器,只能更改第一个创建的URL?

1 投票
1 回答
960 浏览
提问于 2025-04-18 14:36

在我的代码里,我有一个网格布局(GridLayout),里面有按钮和文本输入框。还有一个字典,里面的键是索引,值是CefBrowser(一个浏览器对象)。每当按下一个按钮时,网格布局就会重新调整,把按钮替换成对应的CefBrowser。如果还没有创建这个浏览器,就会新建一个并把它加到字典里。

所有创建的浏览器都会存储在这个字典里(因为从网格中删除浏览器似乎并不能阻止它们在后台运行,比如音频会继续播放)。所以每当按下某个按钮时,所有现有的浏览器应该都能把它们的网址改成一个“空白网站”。

但是奇怪的是,任何更改CefBrowser网址的操作,只有第一个创建的浏览器的网址会被改动。有人知道这是为什么吗?或者我该怎么做才能解决这个问题?

相关代码:

def replaceButton(self, instance):
    browserNumber = instance.getIndex()/2
    try:
        browser = self.activeBrowsers[browserNumber]
        browser.change_url(instance.getURL())
    except KeyError: #browser doesn't already exist
        self.activeBrowsers[browserNumber] = CefBrowser(start_url=instance.getURL(), size_hint_x=1,
                                                        size_hint_y=None)
        browser = self.activeBrowsers[browserNumber]
    self.feed.replace(instance.getIndex(), browser)

def restartFeed(self):
    self.feed.empty()
    for browser in self.activeBrowsers.values():
        print(browser)
        browser.change_url('http://blank.org/')
    self.readData()

我想replaceButton这个方法可能因为逻辑错误而不工作,但我检查了restartFeed里的每个浏览器对象,虽然每个都是独一无二的,但再次强调,只有第一个的URL似乎会被更改。

1 个回答

2

更新:这个问题在cefpython v31中已经修复。

不幸的是,这是CEFPython中的一个bug。你只能使用一个Browser实例,因为某些方法(比如LoadUrlExecuteJavascript)总是会影响第一个创建的Browser。 :(

https://code.google.com/p/cefpython/issues/detail?id=97

看起来已经找到了解决办法,并计划在下一个版本中发布。如果需要的话,你可以尝试从源代码下载并构建CEFPython,并在那个链接中应用补丁。

一个变通的方法是,每次创建Browser时使用正确的起始网址,然后销毁并重新创建Browser来更改网址。但这样做效率很低。

撰写回答