Установить значок окна в Gtk Stock Icon в PyGtk

Я пытаюсь добавить значок Gtk Stock в свое окно. Вот код:

#! /usr/bin/python

from gi.repository import Gtk

class MyWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title='My Window Title')

        self.icon = self.render_icon(Gtk.STOCK_FLOPPY, 1)
        self.set_icon(self.icon)

        self.connect('delete-event', Gtk.main_quit)

win = MyWindow()
win.show_all()
Gtk.main()

Согласно этой странице размер значка должен быть одной из констант размера значка Gtk, но завершение кода Eclipse не показывает ни одно из перечисленных значений, и если я вручную ввожу одно из них, я получаю

AttributeError: у объекта 'gi.repository.Gtk' нет атрибута 'ICON_SIZE_SMALL_TOOLBAR'

Если я установлю размер значка в литерал 1, скрипт будет работать. Я уверен, что это как-то связано с версиями Gtk или PyGtk, но я не могу понять, что я делаю неправильно. Заранее спасибо и извините за вопрос новичка.

1 ответ

Решение

Проблема в том, что вы просматриваете документацию PyGTK, но используете PyGI/GTK3 в своем скрипте.

Документы на gtk_widget_render_icon() говорит следующее:

Начиная с версии 3.0, gtk_widget_render_icon устарела и не должна использоваться во вновь создаваемом коде. Вместо этого используйте gtk_widget_render_icon_pixbuf().

Тогда документы на gtk_widget_render_icon_pixbuf() говорит это:

gtk_widget_render_icon_pixbuf устарела с версии 3.10 и не должна использоваться во вновь создаваемом коде. Вместо этого используйте gtk_icon_theme_load_icon().

Отлично, а?! Итак, давайте двигаться дальше.

gtk_icon_theme_load_icon() принимает следующие аргументы:

  • icon_name: имя иконки для поиска
  • Размер: желаемый размер значка. Получившийся значок может быть не совсем такого размера
  • flags: флаги, изменяющие поведение поиска значков

Зная это, вы можете изменить свой старый render_icon строка со следующим:

        icontheme = Gtk.IconTheme.get_default()
        self.icon = icontheme.load_icon(Gtk.STOCK_FLOPPY, 128, 0)

Который будет искать изображение 128x128 пикселей. Вы можете изменить флаги, если это необходимо, перечисление задокументировано здесь. Это можно перевести на Python следующим образом:

GTK_ICON_LOOKUP_NO_SVG -> Gtk.IconLookupFlags.NO_SVG
GTK_ICON_LOOKUP_FORCE_SVG -> Gtk.IconLookupFlags.FORCE_SVG
GTK_ICON_LOOKUP_USE_BUILTIN -> Gtk.IconLookupFlags.USE_BUILTIN
# And so on...
Другие вопросы по тегам