AppIndicator3:从文件名或 GdkPixbuf 设置指示器图标

AppIndicator3:从文件名或 GdkPixbuf 设置指示器图标

我正在写一个小的 Python 3应用程序它用于AppIndicator3在顶部栏中放置一个图标,然后根据用户操作更改该图标。很简单,对吧?由于该应用程序很小,因此它需要从其源目录运行,而无需任何类型的安装。

问题是AppIndicator3.set_icon()需要str带有图标名称,而不是所述图标的路径。

我怎样才能说服 AppIndicator3 允许我为其指定一个文件名或Pixbuf?或者,我怎样才能将我的图标目录添加到图标名称搜索路径?(我试过了AppIndicator3.set_icon_theme_path(),但我的图标名称仍然无法识别。

答案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/")

在此处输入图片描述在此处输入图片描述

例子

在下面的例子中,所有图标、nocolor.pngpurple.pnggreen.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()

例如应用这里这里

相关内容