如何使用PyGObject

时间:2017-07-18 09:34:35

标签: python gtk3

我在python中有一个非常简单的应用程序,并使用GTK3作为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 进行测试,并确保图标存在。

有人可以帮我弄清楚为什么图标不显示?

P.S。 我试图在我的计算机上运行@morningbird的代码,但图标仍然没有出现在Dash中。

Icon is shown in the window, but not in Dash

我必须将屏幕截图保留为链接,因为我不允许在此处添加图片。

2 个答案:

答案 0 :(得分:2)

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

Wayland 。代码在X11下工作正常,但在Wayland上没有。再次感谢@morningbird的帮助。我已经疯了。当我问这个问题时,我不知道那会有什么不同。

要让它在Wayland中运行,您必须使用

GLib.set_prgname('app_name')

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

答案 1 :(得分:1)

我决定测试代码,看起来它应该正常工作。我将你的逻辑合并到Gtk.Window中,附加了IconViewer,看看加载到pixbufs中的图标。

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运行它,可以在短划线和所有DE元素中正确显示Gtk.Window的图标。

Application window

App in dash

修改

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

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”图标可用性,我会感到惊讶,因为这些方法已经过充分记录和测试。