Python中Adw.AboutDialog无法显示资源图片的问题
问题解决:Adw.AboutDialog无法加载GResource中的图标
问题原因
Adw.AboutDialog.set_application_icon()方法接受的是Freedesktop规范的图标名称,而非直接的GResource文件路径。而Gtk.Image.new_from_resource()是直接从资源中加载文件,两者的工作逻辑完全不同。你在C语言中能正常运行,大概率是因为C代码中额外做了图标主题注册的操作,或者图标已被安装到系统图标主题,而Python代码里遗漏了这一步。
解决方案
方案1:直接加载资源为纹理设置图标
绕过图标名称查找,直接将资源中的图片加载为Gdk.Texture,然后设置给对话框的icon属性:
from gi.repository import Adw, Gdk, Gtk # 初始化对话框 about_dialog = Adw.AboutDialog.new() about_dialog.set_application_name("texty") # 从资源加载纹理并设置为对话框图标 texture = Gdk.Texture.new_from_resource('/texty/texty.svg') about_dialog.set_icon(texture) about_dialog.present()
方案2:将资源路径注册到图标主题
如果希望继续使用set_application_icon()方法(比如需要适配不同尺寸的图标),可以按以下步骤操作:
- 修改
resources.xml,给图标文件添加别名(别名即为图标名称):
<?xml version="1.0" encoding="UTF-8"?> <gresources> <gresource prefix="/texty"> <file alias="texty.svg">texty.svg</file> </gresource> </gresources>
- 重新编译资源:
glib-compile-resources resources.xml --target=resources.gresource
- 在Python代码中,将资源前缀路径添加到Gtk图标主题的搜索路径:
from gi.repository import Adw, Gdk, Gtk, Gio # 注册资源(保持原有代码) resources = Gio.Resource.load('./resources.gresource') Gio.resources_register(resources) # 获取当前显示的图标主题,添加资源路径 icon_theme = Gtk.IconTheme.get_for_display(Gdk.Display.get_default()) icon_theme.add_resource_path('/texty') # 初始化对话框并设置图标名称 about_dialog = Adw.AboutDialog.new() about_dialog.set_application_name("texty") about_dialog.set_application_icon("texty") about_dialog.present()
内容的提问来源于stack exchange,提问作者CraigFoote
相关产品推荐
相关产品推荐

