Создание апплета GNOME


Внешний вид - часть 2


  • на основе полученного изображения формируем пиксельный буфер для выключенного прокси

  • def _reload_pixbufs(self, size=None): """Reload pixbufs from current theme for specified size, or for panel's size if size is None""" if size is None: size = self.applet.get_size() pixbuf = self.theme.load_icon('proxy', size, gtk.ICON_LOOKUP_FORCE_SVG) faded_pixbuf = gtk.gdk.Pixbuf(pixbuf.get_colorspace(), pixbuf.get_has_alpha(), pixbuf.get_bits_per_sample(), pixbuf.get_width(), pixbuf.get_height()) pixbuf.saturate_and_pixelate(faded_pixbuf, 1, True) self.pixbufs[True] = pixbuf self.pixbufs[False] = faded_pixbuf

    И вот в этом коде четко проявляется, что PyGTK - лишь "прослойка" между Python и C-библиотекой GTK: для того, чтобы получить "затемненный" пиксельный буфер (faded_pixbuf), нужно воспользоваться методом saturate_and_pixelate объекта gtk.gdk.Pixbuf, причем метод ничего не возвращает, а "затемненный" пиксельный буфер должен быть передан первым параметром. Что еще более не типично для Python - он обязательно должен быть типа gtk.gdk.Pixbuf. Т.е. нельзя, скажем, инициализировав новый пиксельный буфер значением None, передать его методу saturate_and_pixelate - будет ошибка несовпадения типов. Еще один момент - объект gtk.gdk.Pixbuf не получится скопировать при помощи copy.deepcopy() - опять таки по причине C-природы GTK. Поэтому приходится абсолютно неестественно для Python создавать новый пиксельный буфер, передавая конструктору gtk.gdk.Pixbuf параметры исходного пиксельного буфера. И уже этот, новый пиксельный буфер, "отдавать" saturate_and_pixelate.

    Все остальное в этом методе достаточно просто: в самом начале, если не передан параметр size, то берем размер панели, на которую помещается данный апплет (self.applet.get_size()); а в самом конце сохраняем полученные пиксельные буферы в словарь pixbufs.

    Теперь нужно переопределить методы after_init, где инициализируется начальное состояние апплета и callback-функции _cb_proxy_change на переключение прокси и on_enter на попадание курсора мыши внутрь апплета.


    - Начало -  - Назад -  - Вперед -