AppIndicator3: установить значок индикатора из имени файла или GdkPixbuf

Я пишу небольшое приложение Python 3 , которое использует AppIndicator3, чтобы разместить значок в верхней панели, а затем изменить его в ответ на действия пользователя. Просто, правда? Поскольку приложение небольшого размера, оно должно запускаться из исходного каталога без какой-либо установки.

Проблема в том, что AppIndicator3.set_icon() требуется str с именем иконки, а не путь к этой иконке.

Как я могу убедить AppIndicator3 позволить мне дать ему либо имя файла, либо Pixbuf? Кроме того, как я могу добавить свой каталог значков в путь поиска имени значка? (Я попытался AppIndicator3.set_icon_theme_path(), но мои имена значков все еще не распознаны.

5
задан 10 May 2016 в 17:14

1 ответ

Использовать путь к значку лучше всего проиллюстрировано с примером. В примере ниже, я сохраняю значки в том же каталоге как сценарий (индикатор), который кажется удобным решением в Вашем случае.

Нижняя строка - то, что, после того как Вы инициировали свой индикатор:

class Indicator():
    def __init__(self):
        self.app = "<indicator_name>"
        iconpath = "/path/to/initial/icon/"

        -------------------------------

        self.testindicator = AppIndicator3.Indicator.new(
        self.app, iconpath,
        AppIndicator3.IndicatorCategory.OTHER)

        -------------------------------

можно изменить значок с:

        self.testindicator.set_icon("/path/to/new/icon/")

enter image description here enter image description here

Пример

В примере ниже, все значки, nocolor.png, purple.png и green.png хранятся вместе со сценарием, но путь к значкам, начаться

currpath = os.path.dirname(os.path.realpath(__file__))

мог быть где угодно.

#!/usr/bin/env python3
import os
import signal
import gi
gi.require_version('Gtk', '3.0')
gi.require_version('AppIndicator3', '0.1')
from gi.repository import Gtk, AppIndicator3

currpath = os.path.dirname(os.path.realpath(__file__))

class Indicator():
    def __init__(self):
        self.app = 'show_proc'
        iconpath = currpath+"/nocolor.png"
        # after you defined the initial indicator, you can alter the icon!
        self.testindicator = AppIndicator3.Indicator.new(
            self.app, iconpath,
            AppIndicator3.IndicatorCategory.OTHER)
        self.testindicator.set_status(AppIndicator3.IndicatorStatus.ACTIVE)       
        self.testindicator.set_menu(self.create_menu())

    def create_menu(self):
        menu = Gtk.Menu()
        item_quit = Gtk.MenuItem(label='Quit')
        item_quit.connect('activate', self.stop)
        item_green = Gtk.MenuItem(label='Green')
        item_green.connect('activate', self.green)
        item_purple = Gtk.MenuItem(label='Purple')
        item_purple.connect('activate', self.purple)
        menu.append(item_quit)
        menu.append(item_green)
        menu.append(item_purple)
        menu.show_all()
        return menu

    def stop(self, source):
        Gtk.main_quit()

    def green(self, source):
        self.testindicator.set_icon(currpath+"/green.png")

    def purple(self, source):
        self.testindicator.set_icon(currpath+"/purple.png")

Indicator()
signal.signal(signal.SIGINT, signal.SIG_DFL)
Gtk.main()

Примечание:

... это, если необходимо обновить значок от второго потока, необходимо использовать

GObject.threads_init()

прежде

Gtk.main()

и необходимо обновить интерфейс (или значок или текст индикатора) при помощи:

GObject.idle_add()

как применено, например, здесь и здесь.

5
ответ дан 11 May 2016 в 03:14

Другие вопросы по тегам:

Похожие вопросы: