0

情况描述:Python 3.7、GTK 3.0、PyGObjects 3.34.0 Webkit2 4.0

我有一个对话框窗口,其中 GtkNotebook 包含 2 个选项卡。1. tab 包含可编辑的 Webkit webview, 2. tab 包含 textview。类构造函数中提供的参数之一是作为字符串变量的有效 HTML 片段

结果我想得到的是,在任何窗口中所做的任何更改都会自动反映在其他窗口中。

当前问题:使用此处提供的解决方案,之前在 webview 中所做的任何更改都会在切换记事本选项卡时被丢弃。调试显示通过上述调用获得的 html 不包含更改。

任何想法可能在逻辑或处理本身中缺少什么?

作为参考,对话框的代码如下:

# -*- coding: utf-8 -*-
import gi
gi.require_version('Gtk', '3.0')
gi.require_version('WebKit2', '4.0')
from gi.repository import Gtk, WebKit2



class DescriptionDialog:
    def __init__(self, *args):
# GTK Builder
        self._builder = args[0]
        self._builder.add_from_file("UI/GUI/description.glade")
        self.dialog = self._builder.get_object("descriptionDialog")
        self._textView = self._builder.get_object("textview1")
        self.webViewContainer = self._builder.get_object("WebViewContainer")
        self.browserHolder = WebKit2.WebView()
        self.browserHolder.set_editable(True)
        self.webViewContainer.add(self.browserHolder)
        self.browserHolder.show()
# valid html snippet, held as string
        self.__buffer_orig__ = args[2]
        self.buffer = args[2]
        self.browserHolder.load_html(self.buffer)
        self._builder.connect_signals(
            {
                "onDialogClose": self.onDialogClose,
                "pageChangeNotebook": self.onPageChange
            })
        self.dialog.set_transient_for(self._builder.get_object("MainWindow"))
        self.textBuffer = self._builder.get_object("textbuffer1")
        self.textBuffer.set_text(self.buffer)
        self.dialog.show()

    def onDialogClose(self, handler):
        self.dialog.hide()

    def onPageChange(self, notebook=None, scrolledWindow=None, pageNumber=0):
        if pageNumber == 0:
            self.buffer = self.textBuffer.get_text(self.textBuffer.get_start_iter(), self.textBuffer.get_end_iter(), True)
            self.browserHolder.load_html(self.buffer)
        if pageNumber == 1:
            self.browserHolder.get_main_resource().get_data(None, self.getDataFromResource, None)

    def getDataFromResource(self, resource, result, userData=None):
# Changed html is not returned here
        self.buffer = str(resource.get_data_finish(result).decode("utf-8"))
        self.textBuffer.set_text(self.buffer)
4

1 回答 1

0

对于其他找到此线程的互联网用户。目前,在给定的版本中,这是我想出的工作结果。此实现的主要思想如下 - 使用启用 WebView 的 Javascript 引擎来获取<body>标签的内容。然后,解析 Javascript 结果以稍后使用此值。

def onPageChange(self, notebook=None, scrolledWindow=None, pageNumber=0):
    if pageNumber == 0:
        self.buffer = self.textBuffer.get_text(self.textBuffer.get_start_iter(), self.textBuffer.get_end_iter(), True)
        self.browserHolder.load_html(self.buffer)
    if pageNumber == 1:
        # use JavaScript to get the html contained in rendered body tag
        script = "document.body.innerHTML;"
        # Execute JavasScript via WebKit2.WebView bindings.
        # Result can be obtained asynchronously, via callback method
        self.browserHolder.run_javascript(script, None, self.getJSStatus, None)

def getJSStatus(self, resource, result, userData=None):
    # Sample adapted and simplified from here:
    # https://lazka.github.io/pgi-docs/#WebKit2-4.0/classes/WebView.html#WebKit2.WebView.run_javascript_finish
    # Get the JavaScript result
    data = self.browserHolder.run_javascript_finish(result)
    # Get value from result, and convert it to string
    self.buffer = data.get_js_value().to_string()
    self.textBuffer.set_text(self.buffer)
于 2019-12-01T16:53:56.463 回答