Kivy Garden - 多个Chromium嵌入式浏览器,只能更改第一个创建的URL?
在我的代码里,我有一个网格布局(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
实例,因为某些方法(比如LoadUrl
和ExecuteJavascript
)总是会影响第一个创建的Browser
。 :(
https://code.google.com/p/cefpython/issues/detail?id=97
看起来已经找到了解决办法,并计划在下一个版本中发布。如果需要的话,你可以尝试从源代码下载并构建CEFPython,并在那个链接中应用补丁。
一个变通的方法是,每次创建Browser
时使用正确的起始网址,然后销毁并重新创建Browser
来更改网址。但这样做效率很低。