我正在使用GTK3(来自gi.repository)和python3创建一个UI。当我向UI添加默认图标然后运行程序时,它会因同伴错误而崩溃:
segmentation fault (core dumped) python main.py
我正在使用Gtk.Window的set_icon_list
方法添加图标:
self.c_win.set_icon_list(icon_list)
如果我对此行发表评论,该程序将按预期运行。我得到了带有以下功能的图标列表:
def load_icon():
req = pkg_resources.Requirement.parse("pympress")
# If pkg_resources fails, load from directory
try:
icon_names = pkg_resources.resource_listdir(req, "share/pixmaps")
except pkg_resources.DistributionNotFound:
icon_names = os.listdir("share/pixmaps")
icons = []
for icon_name in icon_names:
if os.path.splitext(icon_name)[1].lower() != ".png":
continue
# If pkg_resources fails, load from directory
try:
icon_fn = pkg_resources.resource_filename(req, "share/pixmaps/{}".format(icon_name))
except pkg_resources.DistributionNotFound:
icon_fn = "share/pixmaps/{}".format(icon_name)
try:
icon_pixbuf = Pixbuf()
icon_pixbuf.new_from_file(icon_fn)
icons.append(icon_pixbuf)
except Exception as e:
print(e)
return icons
它返回一个Pixbuf列表,它是set_icon_list的预期输入。
完整的代码可以在github上找到:https://github.com/Jenselme/pympress知道问题是什么吗?
答案 0 :(得分:1)
虽然它不应该崩溃,但部分问题可能是由于new_from_file()的使用方式。 new_from_file()是一个构造函数,它返回一个 new pixbuf,你应该存储在一个变量中。它不会将文件的内容加载到现有的pixbuf中。所以“图标”列表实际上包含一堆空(或更确切地说是1x1)pixbuf。
# Creates a new 1x1 pixbuf.
icon_pixbuf = Pixbuf()
# Creates a new pixbuf from the file the value of which is lost
# because there is no assignment.
icon_pixbuf.new_from_file(icon_fn)
# Stores the first 1x1 pixbuf in the list.
icons.append(icon_pixbuf)
你真正想要的是:
icon_pixbuf = Pixbuf.new_from_file(icon_fn)
icons.append(icon_pixbuf)
无论如何,它不应该是段错误的。请使用导致崩溃的最小代码示例将其记录为错误: https://bugzilla.gnome.org/enter_bug.cgi?product=pygobject
另请注意正在使用的gi和GTK +的版本:
import gi
from gi.repository import Gtk
print(gi.version_info)
print(Gtk.MINOR_VERSION)