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


Внешний вид


Общая структура апплета аналогична таковой во второй части: наследуемся от ProxyGnomeApplet:

class ProxySwitcherGnomeApplet(ProxyGnomeApplet)

И переопределяем нужные методы. Во-первых, роль главного виджета играет gtk.Image, а не gtk.Label как в "модельном" апплете.

def init_additional_widgets(self): """Create additional widgets""" self._init_pixbufs() self.image = gtk.Image() self.ev_box.add(self.image)

gtk.Image это некий "контейнер" изображения. Его можно "заполнить" данными из различных источников, мы будем использовать пиксельный буфер (pixbuf). Само изображение (как пиксельный буфер) будем брать из значка "Прокси" текущей темы. Если в текущей теме не будет такой иконки - будем использовать тему Tango.

def _init_pixbufs(self): """Init pixbufs from current theme, or from Tango, if 'proxy' icon not in current theme""" self.pixbufs = {} self.theme = self._get_theme() try: self._reload_pixbufs() except gobject.GError: self.theme = self._get_theme('Tango') self._reload_pixbufs()

Мы будем использовать словарь pixbufs для хранения пиксельных буферов для включенного и выключенного состояния прокси. В первой строке мы инициализируем этот словарь. Во второй - получаем текущую тему. Потом пробуем подгрузить значок "Прокси" из текущей темы (self._reload_pixbufs()), если такого значка нет (исключение gobject.GError), то используем тему Tango и уже с нее загружаем значок.

Название текущей темы берем из GConf, ключ /desktop/gnome/interface/icon_theme: def _get_theme(self, name=None): """Return a theme by name, or current one if name is None""" if name is None: name = gconf.client_get_default().get_string('/desktop/gnome/interface/icon_theme') theme = gtk.IconTheme() theme.set_custom_theme(name) return theme

В методе _reload_pixbufs мы решаем сразу несколько задач: