我正在准备一个用于条形码生成的小程序。我在自定义 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 文件?
这是一个远景,但值得:
我只是想指出,有时我们看到的直接错误并不是真正的问题。我知道您通过升级解决了问题(顺便说一句,做得很好),并且我知道您的回溯中没有提到线程。所以这与您的问题不同,但这是我得到的回溯:
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 )
所以最后我建议的是,也许有一种方法可以通过做一些“分而治之”来修复你的代码,即通过简化和隔离程序中的代码进行测试,移动到程序中的不同位置,等等