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

时间:2019-06-13 13:10:44

标签: python pygtk webkitgtk

我正在编写一个小型应用程序,以通过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实例设置才能使其与我测试过的浏览器类似,但是我不确定如何在此处进行操作。

1 个答案:

答案 0 :(得分: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

在我看来,SVG呈现得很好(我看不到任何丢失的元素)。