簡體   English   中英

來自SVG的Python Gtk3窗口圖標/來自庫存主題的可縮放圖標

[英]Python Gtk3 Window Icon from SVG / scalable icon from stock theme

如何為Gtk.Window設置高品質的圖標? 我的主題有SVG圖標,但我總是得到24像素的像素大小。 那我的代碼有什么問題? 一些幫助會很高興。 謝謝

在此輸入圖像描述

最大尺寸始終為24

#!/usr/bin/python3

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

window = Gtk.Window()
window.connect("delete-event", Gtk.main_quit)

icon_name = "applications-mail"
icon_theme = Gtk.IconTheme.get_default()

found_icons = set()
for res in range(0, 512, 2):
    icon = icon_theme.lookup_icon(icon_name, res, 0)
    found_icons.add(icon.get_filename())
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)
window.set_default_icon_list([pixbuf])

window.show_all()
Gtk.main()

回應

/usr/share/icons/Mint-X/categories/22/applications-mail.png
/usr/share/icons/Mint-X/categories/48/applications-mail.png
/usr/share/icons/Mint-X/categories/96/applications-mail.svg
/usr/share/icons/Mint-X/categories/32/applications-mail.png
/usr/share/icons/Mint-X/categories/16/applications-mail.png
/usr/share/icons/Mint-X/categories/24/applications-mail.png
max size = 24 ([22, 16, 24])

我可能弄錯了,這里有一些想法:

  • 我的機器上沒有任何名為“applications-mail”的圖標。 我確實發現了許多“互聯網郵件”圖標。

/usr/share/icons/Mint-X/categories/96/applications-mail.svg

  • 另外,我相信svg圖標應該在一個scalable目錄中。 可能你發現的svg並沒有被認出來。 例如。 我有:

/usr/share/icons/Tango/scalable/apps/internet-mail.svg

  • 我稍微修改了你的程序:

清單:

#!/usr/bin/env python3

from gi.repository import Gtk

class MainWindow(Gtk.Window):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.connect("delete-event", Gtk.main_quit)

        #icon_name = "applications-mail"
        icon_name = "internet-mail"
        icon_theme = Gtk.IconTheme.get_default()

        found_icons = set()
        for res in range(0, 512, 2):
            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])

        self.show_all()

    def run(self):
        Gtk.main()


def main(args):
    mainwdw = MainWindow()
    mainwdw.run()

    return 0

if __name__ == '__main__':
    import sys
    sys.exit(main(sys.argv))

我得到:

/usr/share/icons/Tango/24x24/apps/internet-mail.png
/usr/share/icons/Tango/scalable/apps/internet-mail.svg
/usr/share/icons/Tango/16x16/apps/internet-mail.png
/usr/share/icons/Tango/32x32/apps/internet-mail.png
/usr/share/icons/Tango/22x22/apps/internet-mail.png
max size = 32 ([22, 16, 24, 32, -1, 0])

其中-1表示可縮放圖標。 (所以,不要使用max() - 查找-1。這來自開發人員的網站

[gtk_icon_theme_get_icon_sizes]返回一個整數數組,描述圖標可用的大小而不進行縮放。 大小為-1表示該圖標以可伸縮格式提供。

編輯 :更多想法:

  • Gtk使用gdk-pixbuf.loaders模塊來渲染圖標等圖像。 您可能沒有svg驅動程序正常工作。 我似乎也記得librsvg庫是必要的。

  • 即使另一個圖標實際工作,您可能會看到圖標緩存中的副本,並且您的圖標渲染器可能仍然失敗。

  • 圖標緩存本身甚至可能存在問題。 嘗試重建緩存

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM