如何保存编辑的Webview结果?

问题描述 投票:0回答:1

情况说明:Python 3.7,GTK 3.0,PyGObjects 3.34.0 Webkit2 4.0

我有一个对话框窗口,其中的GtkNotebook包含2个标签。1.选项卡包含可编辑的Webkit Web视图,2.选项卡包含textview。类构造函数中提供的参数之一是有效的HTML代码段,它是字符串变量

因此,我希望在任何窗口中进行的任何更改都会自动反映在其他窗口中。

当前问题:使用提供的解决方案here,在切换记事本选项卡时,将放弃在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)
python-3.7 pygtk webkit2
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)
© www.soinside.com 2019 - 2024. All rights reserved.