tksvg - _tkinter.TclError:无法加载文件 libtksvg.so

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

我正在准备一个用于条形码生成的小程序。我在自定义 tkinter 中准备了 GUI,并且 svg 文件中有条形码。

我正在尝试使用 tksvg 加载 svg 文件。一段时间以来,当我以普通用户身份运行程序时是可能的,但以管理员身份运行程序是不可能的(sudo python ...)。 我重新安装 tksvg 但现在两个用户(普通用户和管理员)都出现相同的错误:

Traceback (most recent call last):
  File "/home/pi/laser/barcode_generator_picture.py", line 27, in <module>
    svg_image = tksvg.SvgImage(file="barcode.svg", scale=3)
  File "/usr/local/lib/python3.9/dist-packages/tksvg/__init__.py", line 50, in _   _init__
    load(master)
  File "/usr/local/lib/python3.9/dist-packages/tksvg/__init__.py", line 27, in l   oad
    window.tk.eval("package require tksvg")
_tkinter.TclError: couldn't load file "/usr/local/lib/python3.9/dist-packages/tk   svg/libtksvg.so": /usr/local/lib/python3.9/dist-packages/tksvg/libtksvg.so: cann   ot open shared object file: No such file or directory
Exception ignored in: <function Image.__del__ at 0x7f8d35ddc0>
Traceback (most recent call last):
  File "/usr/lib/python3.9/tkinter/__init__.py", line 4015, in __del__
    if self.name:
AttributeError: 'SvgImage' object has no attribute 'name'

我应该如何加载 svg 文件?

python tksvg
1个回答
0
投票

这是一个远景,但值得:

我只是想指出,有时我们看到的直接错误并不是真正的问题。我知道您通过升级解决了问题(顺便说一句,做得很好),并且我知道您的回溯中没有提到线程。所以这与您的问题不同,但这是我得到的回溯:

    Exception in thread Thread-1:
Traceback (most recent call last):
  File "C:\Program Files\Python38\lib\threading.py", line 932, in _bootstrap_inner
    self.run()
  File "C:\Program Files\Python38\lib\threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "dhd.py", line 349, in update_first_time
    self.update_forecast_labels()
  File "dhd.py", line 710, in update_forecast_labels
    svg_img = tksvg.SvgImage( scaletoheight = 100, data = '<svg ... </svg>' )
  File "C:\Program Files\Python38\lib\site-packages\tksvg\__init__.py", line 50, in __init__
    load(master)
  File "C:\Program Files\Python38\lib\site-packages\tksvg\__init__.py", line 26, in load
    window.tk.eval("source pkgIndex.tcl")
RuntimeError: Calling Tcl from different apartment
Exception ignored in: <function Image.__del__ at 0x0000000002A8BCA0>
Traceback (most recent call last):
  File "C:\Program Files\Python38\lib\tkinter\__init__.py", line 4015, in __del__
    if self.name:
AttributeError: 'SvgImage' object has no attribute 'name'

请注意,我正在处理底部完全相同的错误。这是生成它的代码(实际上是第一行):

    svg_img = tksvg.SvgImage( scaletoheight = 100, data = '<svg ... </svg>' )
    lb = tk.Label( image = svg_img, master = tkapp )
    lb.grid( row = 1, column = 2 )

当然,在此之前我会“导入 tkinter as tk”和“导入 tksvg”。如果我运行在单独文件中隔离的相同代码,则不会出现错误。问题是 tksvg.SvgImage() 调用不是在主 tkinter 线程中运行,而是在单独的线程中运行。我可以通过在主 tkinter 线程中运行代码来轻松修复它:

tkapp.after( 100, my_function_to_run_tksvg_code )

所以最后我建议的是,也许有一种方法可以通过做一些“分而治之”来修复你的代码,即通过简化和隔离程序中的代码进行测试,移动到程序中的不同位置,等等

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