首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可以用AppIndicator3添加动画吗?

可以用AppIndicator3添加动画吗?
EN

Stack Overflow用户
提问于 2020-05-08 01:54:40
回答 2查看 172关注 0票数 1

我正在尝试用Python创建一个简单的AppIndicator。代码与下面的代码非常相似:

代码语言:javascript
复制
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,但它不能正常工作。

有没有办法在AppIndicator3中创建一个GdkPixbuf.PixbufAnimation (示例)?

如果是,我该怎么做?

EN

回答 2

Stack Overflow用户

发布于 2020-05-08 02:00:24

我不知道我的答案是否适用于您,但我看到您只是在导入库、赋值变量和定义一些代码。您可能希望通过键入以下命令来实现main():代码循环:

您可以选择添加return Truereturn False

代码语言:javascript
复制
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

或者,如果您希望代码继续运行,直到您单击停止按钮:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2020-05-09 05:32:59

我找到了解决此问题的方法。特别是当您尝试配置GIF时。

对我来说,创建一个GIF手册是可行的。这个解决方案需要一个与并发相关的更好的方法,但原型在这里:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61664503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档