所以我正在使用 Oython / GTK+ 创建一个小程序,它的核心是一个显示一些 HTML 页面的 WebView。我现在想允许用户通过突出显示文本、下划线文本等来操作视图。稍后我希望我的程序将此标记存储在不同的文件中,以便以后可以动态加载它。
我可以简单地将 WebView 设置为可编辑,但随后我必须保存更改后的 HTML 文档;我宁愿保持原始文档不变并单独保存用户标记。
我的想法是使用 DOM,尤其是。DOMDOMSelection 和 DOMRange 函数。WebKit3.0 API(此处)指出
WebKitViewer.get_dom_document()
应该返回一个WebKit.DOMDocument。但是,正如运行附加的 MWE(如下)所示,此调用返回WebKit.DOMHTMLDocument。使用此对象,我找不到访问 DOMDocument 或 DOMDOMSelection 的方法,我需要继续进行。
我的问题:
问:这是一个已知的错误还是我使用了错误的调用?
编辑1:
虽然我不确定上面提到的返回值是否正确,但我找到了一种解决问题的方法:
# The still strange return document
DOMHTMLdoc = editor.get_dom_document()
# The view that contains the doc
def_view = DOMHTMLdoc.get_default_view()
# On this view one can finally create a selection
sel = def_view.get_selection()
END_EDIT1
如果有另一种(更简单的)方法来实现这一点,我愿意接受建议;)提前致谢。
设置:
Linux Antergos 4.9.11-1-ARCH x86_64
吉尼
Python3.6.0
gir1.0
MWE
import gi
import os
gi.require_version('Gtk', '3.0')
gi.require_version('WebKit', '3.0')
from gi.repository import Gtk, WebKit
w = Gtk.Window()
w.set_title("Example Editor")
w.set_default_size(800,400)
w.connect("destroy", Gtk.main_quit)
message = "<!DOCTYPE html><html><head><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><title>ERSTE SCHRITTE MIT BRACKETS</title><meta name=\"description\" content=\"Ein interaktiver Wegweiser für die ersten Schritte mit Brackets.\"><link rel=\"stylesheet\" href=\"main.css\"></head><body><h1>ERSTE SCHRITTE MIT BRACKETS</h1><h2>Dies ist Ihre Anleitung!</h2><p> Willkommen zu Brackets, einem modernen, quelloffenen Code-Editor, der Webdesign versteht. Es ist ein einfacher, aber dennoch leistungsfähiger Editor, der Ihnen immer die richtigen Tools einblendet, sodass Sie die genau richtige Menge an Hilfestellung haben, wann immer Sie diese brauchen.</p></body></html>"
editor = WebKit.WebView()
status = editor.get_load_status()
DOMHTMLdoc = editor.get_dom_document()
def load_up(self):
editor.load_string(message,"text/html","utf-8","file://")
def show_status(self):
# Give the WebView some time to load everything
status = editor.get_load_status()
if status == 2:
# Here I would expect a DOMDocument to be returned
# but instead I get DOMHTMLDocument
DOMHTMLdoc = editor.get_dom_document()
el = DOMHTMLdoc.get_active_element()
coll = el.get_children()
length = coll.get_length()
print("DOMHTMLdoc: ")
print(DOMHTMLdoc)
# Here I can loop over the elements, but always DOMHTMLxx
print("DOMHTMLElement: ")
print(el)
for i in range(0, length):
print(coll.item(i))
hb = Gtk.HBox()
vb = Gtk.VBox()
b = Gtk.Button("Load")
b.connect("clicked", load_up)
b2 = Gtk.Button("DOM status")
b2.connect("clicked", show_status)
swindow = Gtk.ScrolledWindow()
swindow.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
swindow.add(editor)
hb.add(b)
hb.add(b2)
vb.pack_start(hb, False, False, 0)
vb.add(swindow)
w.add(vb)
w.show_all()
Gtk.main()