【问题标题】:How do I set an icon for the whole application using PyGObject如何使用 PyGObject 为整个应用程序设置图标
【发布时间】:2017-07-20 23:14:20
【问题描述】:

我在 python 中有一个非常简单的应用程序,并使用 GTK3 for gui。我只想为它设置一个默认图标,以便它在 Gnome-shell 中的 Dash 中运行。

我很绝望,我不知道自己做错了什么。

我使用了这个代码:

Gtk.Window.__init__(self, title="Window title")
icon=("firefox")
pixbuf24 = Gtk.IconTheme.get_default().load_icon(icon, 24, 0)
pixbuf32 = Gtk.IconTheme.get_default().load_icon(icon, 32, 0)
pixbuf48 = Gtk.IconTheme.get_default().load_icon(icon, 48, 0)
pixbuf64 = Gtk.IconTheme.get_default().load_icon(icon, 64, 0)
pixbuf96 = Gtk.IconTheme.get_default().load_icon(icon, 96, 0)
self.set_icon_list([pixbuf24, pixbuf32, pixbuf48, pixbuf64, pixbuf96]);

我没有收到任何错误消息,但还没有显示任何图标。我选择 firefox 进行测试并确保图标存在。

谁能帮我弄清楚为什么图标不显示?

附: 我尝试在我的计算机上运行 @morningbird 的代码,但 Dash 中仍然没有出现该图标。

Icon is shown in the window, but not in Dash

我必须留下截图作为链接,因为我不能在这里包含图片。

【问题讨论】:

  • 如果您要检查 pixbufs,您能确定图标加载正确吗?我运行了那个代码,它工作得很好。
  • 所以它确实为您@morningbird 设置了应用程序的图标?即使在 Gnome-shell 中的 Dash 中?如何检查 pixbuf?你能给我一个提示吗?
  • 是的,同样在 Gnome-shell 的 Dash 中,我正在使用的是 DE。而且我还只是在窗口内的 IconViewer 中显示了一个 pixbufs 图标,但是适当的 python 调试器应该可以让您在运行时检查对象。
  • 我会发布代码作为答案,因为 cmets 不允许多行代码。

标签: python gtk3


【解决方案1】:

我终于找到了问题的原因。

它是韦兰。该代码在 X11 下运行良好,但在 Wayland 上不行。再次感谢@morningbird 的帮助。我已经快疯了。当我问这个问题时,我不知道这会有什么不同。

要让它在 Wayland 中工作,你必须使用

GLib.set_prgname('app_name')

app_name 必须对应于相应*.desktop 文件中的exec= 条目。之后,name= 将用作应用程序名称,icon= 将用作 Dash 中的图标。

【讨论】:

  • 该死,我知道韦兰的那件事。在我的个人应用程序中遇到了问题。我确信它不会影响以编程方式设置 Gtk.Window 图标,只是桌面文件关联。
  • 另外,您应该将您的答案标记为对问题正确。
  • 单个窗口不是应用程序,除此之外,你为什么不直接使用ˋset_icon_nameˋ?
【解决方案2】:

我决定测试代码,因为它看起来应该可以正常工作。我将您的逻辑与附加的 IconViewer 合并到 Gtk.Window 中,以查看加载到其中一个 pixbuf 中的图标。

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
from gi.repository.GdkPixbuf import Pixbuf

icon = ("firefox")

class IconViewWindow(Gtk.Window):

  def __init__(self):
    Gtk.Window.__init__(self)
    self.set_default_size(200, 200)

    liststore = Gtk.ListStore(Pixbuf, str)
    iconview = Gtk.IconView.new()
    iconview.set_model(liststore)
    iconview.set_pixbuf_column(0)
    iconview.set_text_column(1)

    pixbuf24 = Gtk.IconTheme.get_default().load_icon(icon, 24, 0)
    pixbuf32 = Gtk.IconTheme.get_default().load_icon(icon, 32, 0)
    pixbuf48 = Gtk.IconTheme.get_default().load_icon(icon, 48, 0)
    pixbuf64 = Gtk.IconTheme.get_default().load_icon(icon, 64, 0)
    pixbuf96 = Gtk.IconTheme.get_default().load_icon(icon, 96, 0)
    self.set_icon_list([pixbuf24, pixbuf32, pixbuf48, pixbuf64, pixbuf96])
    liststore.append([pixbuf64, "firefox"])

    self.add(iconview)

win = IconViewWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()

在 Gnome 3.24 下使用 python3 运行它会导致 Gtk.Window 的图标在破折号和所有 DE 元素中正确显示。

编辑:

也许做一个适当的图标发现(因为您目前没有使用自行安装的图标)可能有助于获得一些见解。

icon_name = "firefox"
icon_theme = Gtk.IconTheme.get_default()

found_icons = set()
for res in range(24, 32, 48, 64, 96):
    icon = icon_theme.lookup_icon(icon_name, res, 0)
    #print(icon)
    if icon != None:
        found_icons.add(icon.get_filename())

if len(found_icons) > 0:
    print("\n".join(found_icons))
    sizes = Gtk.IconTheme.get_default().get_icon_sizes(icon_name)
    max_size = max(sizes)
    print("max size = {} ({})".format(max_size, sizes))
    pixbuf = icon_theme.load_icon(icon_name, max_size, 0)
    self.set_default_icon_list([pixbuf])

编辑 2:

一般来说,Gtk.Window.set_icon_name("icon-name") 是使用已安装图标的更好方法,因为所有图标大小选择都会为您处理。使用设置大小的本地 PNG 图标时,使用 Gtk.Windowset_default_icon_list([pixbufs]) 是一个不错的选择。

如果问题不在于“firefox”图标的可用性,我会感到惊讶,因为这些方法已经过详细记录和测试。

【讨论】:

  • 感谢@morningbird 的帮助!我只是尝试运行您的示例,这就是我所拥有的。它仍然无法按预期工作。
  • Icon is shown in the window, but not in Dash我必须把截图留作链接,因为我不能在这里包含图片。
  • 我编辑了答案。这是我唯一可以补充的。另一种方法是设置应用程序 ID 并安装桌面条目。还要检查self.set_icon_name("firefox") 是否有效?
  • 非常感谢@morningbird 的帮助!我真的很感激。一旦我有一些结果,我会发布我的结果。 self.set_icon_name("firefox") 也不设置图标。我什至尝试更改图标主题,但没有更好的结果
  • 输出中是否有任何 GTK 警告?我很抱歉,但我想我不知道如何提供帮助。其他然后说 - 这总是对我有用。我对这里可能出现的问题一无所知。也许您还应该使用默认的 Adwaita 图标包进行测试?
猜你喜欢
  • 2021-05-20
  • 2013-08-17
  • 2011-11-03
  • 2012-01-03
  • 2020-07-01
  • 1970-01-01
  • 2019-01-07
  • 1970-01-01
  • 2011-07-18
相关资源
最近更新 更多