某些SVG元素未在python webkitgtk应用程序中呈现

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

我正在编写一个小型应用程序,以通过WebKit和SchemDraw使用python gtk3绑定生成电路图。我的意图是使用SchemDraw的svg输出(内部使用matplotlib)并将其呈现在WebView小部件中。当我加载由matplotlib生成的svg(从文件和StringIO)时,WebView窗口中缺少一些水平和垂直线元素。

我尝试在多个浏览器(Firefox,Google Chrome和Epiphany)中打开相同的svg文件,并且所有元素均正确呈现。我以为Epiphany是一个很好的测试,因为它似乎使用WebView实例,尽管在C语言中。

gtk程序:

import pgi as gi
gi.install_as_gi()
gi.require_version('Gtk', '3.0')
gi.require_version('WebKit', '3.0')
from gi.repository import Gtk
from gi.repository import Gdk
from gi.repository import WebKit
print ("PyGtk v%s" % gi.__version__)

# Test webkit SVG rendering
window = Gtk.Window(title="Hello World")
webview1 = WebKit.WebView()
webview1.open('file:///redacted_path/example.svg')
window.add(webview1)
window.show_all()
window.connect("destroy", Gtk.main_quit)
Gtk.main()

呈现example.svg的代码(SchemDraw网站上的示例):

import SchemDraw as schem
import SchemDraw.elements as e
d = schem.Drawing()
V1 = d.add(e.SOURCE_V, label='10V')
d.add(e.RES, d='right', label='100K$\Omega$')
d.add(e.CAP, d='down', botlabel='0.1$\mu$F')
d.add(e.LINE, to=V1.start)
d.add(e.GND)
d.draw()
d.save("example.svg")

[我怀疑需要更多的WebView实例设置才能使其与我测试过的浏览器类似,但我不确定如何在此进行操作。

python pygtk webkitgtk
1个回答
0
投票

我在笔记本电脑(Ubuntu 19.10)上试用了您的代码,并且可以正常工作。不过,我不得不做出一些更改(Ubuntu 19.10拥有gir-webkitgtk的最新版本,并且我还将SVG保存到文件中并通过URL打开)。

这是我的代码,其中包括修改内容:

#!/usr/bin/env python

import SchemDraw as schem
import SchemDraw.elements as e

d = schem.Drawing()
V1 = d.add(e.SOURCE_V, label='10V')
d.add(e.RES, d='right', label='100K$\Omega$')
d.add(e.CAP, d='down', botlabel='0.1$\mu$F')
d.add(e.LINE, to=V1.start)
d.add(e.GND)
d.draw()
d.save("example.svg")

我注意到'example.svg'没有自动保存。因此,一旦打开了带有电路的窗口,我就可以使用菜单将其手动保存到SVG文件中。

#!/usr/bin/env python

import pgi as gi

gi.install_as_gi()
gi.require_version('Gtk', '3.0')
gi.require_version('WebKit2', '4.0')
from gi.repository import Gtk
from gi.repository import Gdk
from gi.repository import WebKit2
print ("PyGtk v%s" % gi.__version__)

# Test webkit SVG rendering
url = 'http://127.0.0.1:8001/example.svg'
window = Gtk.Window(title="Hello World")
webview1 = WebKit2.WebView()
webview1.load_uri(url)
window.add(webview1)
window.show_all()
window.connect("destroy", Gtk.main_quit)
Gtk.main()

截屏:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.