You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()方法(比如需要适配不同尺寸的图标),可以按以下步骤操作:

  1. 修改resources.xml,给图标文件添加别名(别名即为图标名称):
<?xml version="1.0" encoding="UTF-8"?>
<gresources>
  <gresource prefix="/texty">
    <file alias="texty.svg">texty.svg</file>
  </gresource>
</gresources>
  1. 重新编译资源:
glib-compile-resources resources.xml --target=resources.gresource
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 15:36:03