可以用AppIndicator3添加动画吗?

问题描述 投票:1回答:1

我试图用Python创建一个简单的AppIndicator.代码与AppIndicator3非常相似。

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()

它工作得很好,但我想引入一个动画图标。例如,一个闪烁的图标。而不是一个静态的图标。

我试图将SVG文件转换为GIF,但效果不佳。

有什么办法可以创建一个 GdkPixbuf.PixbufAnimation (例如)在AppIndicator3内?

如果是,我该如何做?

python gtk appindicator
1个回答
0
投票

我不知道我的答案是否对你有用,但我看到你只是导入库,分配一个变量,并定义一些代码。你可能想通过输入main(): 代码循环。

这将给你一个选项来添加 返回真返回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()

0
投票

我找到了一个变通的方法 特别是,如果你想配置一个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个不同帧的spinner,我可以用一个Thread和Tread进行迭代。set_icon + GLib.iddle_add().

同样,它需要在Thread并发方面有更好的解决方案,但它可以作为一个起点。

© www.soinside.com 2019 - 2024. All rights reserved.