所以我使用Oython / GTK +创建一个小程序,它的核心是一个显示一些HTML页面的WebView。我现在想让用户通过突出显示文本,下划线文本等来操作视图。后来我希望我的程序将此标记存储在不同的文件中,以便以后可以动态加载。
我可以简单地将WebView设置为可编辑,但是我必须保存更改的HTML文档;我宁愿保持原始文档不变,并单独保存用户标记。
我的想法是使用DOM,尤其是。 DOMDOMSelection和DOMRange函数。 WebKit3.0 API(here)表明
WebKitViewer.get_dom_document()
应该返回 WebKit.DOMDocument 。但是,当运行附加的MWE(如下所示)时,此调用将返回 WebKit.DOMHTMLDocument 。 使用这个对象我找不到访问DOMDocument或DOMDOMSelection的方法,我需要继续进行。
我的问题:
问:这是一个已知的错误还是我使用了错误的电话?EDIT1:
虽然我不确定上面提到的返回值是否正确,但我找到了解决问题的方法:
# 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
Geany
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()