Можно ли добавить анимацию с помощью AppIndicator3? - PullRequest
1 голос
/ 07 мая 2020

Я пытаюсь создать простой AppIndicator с Python. Код очень похож на:

import gi
from gi.repository import Gtk
from gi.repository import AppIndicator3 as appindicator

APPINDICATOR_ID = 'myapp'

def main():
    indicator = appindicator.Indicator.new(APPINDICATOR_ID, '/usr/share/myapp/images/icon.svg', appindicator.IndicatorCategory.SYSTEM_SERVICES)
    indicator.set_status(appindicator.IndicatorStatus.ACTIVE)
    Gtk.main()

Он работает очень хорошо, но я хотел бы представить анимированный значок. Например, мигающий значок. Не stati c one.

Я попытался преобразовать файл SVG в GIF, но он тоже не работает.

Есть ли способ создать GdkPixbuf.PixbufAnimation (пример ) в AppIndicator3?

Если да, как это сделать?

Ответы [ 2 ]

0 голосов
/ 09 мая 2020

Я нашел обходной путь для этого. Особенно, если вы пытаетесь настроить GIF.

Для меня создание GIF вручную сработало. Это решение требует лучшего подхода, связанного с параллелизмом, но прототип здесь:

import gi
import time
import signal
import threading

gi.require_version('Gtk', '3.0')
gi.require_version('AppIndicator3', '0.1')

from gi.repository import Gtk, GLib
from gi.repository import AppIndicator3 as appindicator

APPINDICATOR_ID = 'myapp'

finished = False

def change_icon(indicator, index=5):
    indicator.set_icon("spinner-%s.svg" % str(index))

def render_icon(indicator):
    i = 0
    while True:
        # I have 10 SVG images
        index = (i % 10)
        GLib.idle_add(change_icon, indicator, index)
        time.sleep(0.5)
        if finished:
            break
        i += 1

def on_click(widget):
    global finished
    finished = True
    Gtk.main_quit()

def main():
    indicator = appindicator.Indicator.new(APPINDICATOR_ID, 'spinner-0.svg', appindicator.IndicatorCategory.SYSTEM_SERVICES)
    indicator.set_status(appindicator.IndicatorStatus.ACTIVE)

    menu = Gtk.Menu()
    quit = Gtk.MenuItem('Quit')
    quit.connect('activate', on_click)
    menu.append(quit)

    menu.show_all()

    indicator.set_menu(menu)

    thread = threading.Thread(target=render_icon, args=(indicator,))
    thread.daemon = True
    thread.start()

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

main()

Я создал счетчик с 10 разными кадрами, и я могу выполнять итерацию, используя поток и set_icon + GLib.iddle_add().

Опять же, для этого требуется лучшее решение с точки зрения согласованности потоков, но оно работает как отправная точка.

0 голосов
/ 07 мая 2020

Я не знаю, подойдет ли вам мой ответ, но я вижу, что вы только импортируете библиотеки, назначаете переменную и определяете некоторый код. Вы можете использовать main (): code l oop, набрав:

Это даст вам возможность добавить return True или return False :

import gi
from gi.repository import Gtk
from gi.repository import AppIndicator3 as appindicator

APPINDICATOR_ID = 'myapp'

def main():
    indicator = appindicator.Indicator.new(APPINDICATOR_ID, '/usr/share/myapp/images/icon.svg', appindicator.IndicatorCategory.SYSTEM_SERVICES)
    indicator.set_status(appindicator.IndicatorStatus.ACTIVE)
    Gtk.main()

while main():
    pass

Или, если вы хотите, чтобы код продолжал действовать, пока вы не нажмете кнопку остановки:

import gi
from gi.repository import Gtk
from gi.repository import AppIndicator3 as appindicator

APPINDICATOR_ID = 'myapp'

def main():
    indicator = appindicator.Indicator.new(APPINDICATOR_ID, '/usr/share/myapp/images/icon.svg', appindicator.IndicatorCategory.SYSTEM_SERVICES)
    indicator.set_status(appindicator.IndicatorStatus.ACTIVE)
    Gtk.main()

main()
...