Написание индикаторов с помощью Python, GIR и GTK3

18

Я пишу приложение, которое должно использовать индикатор. Я делал это в прошлом, используя PyGTK и GTK2, используя в качестве ссылки этот документ: https://wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators#Python_version

Однако это работает только с PyGTK и GTK2. С тех пор все изменилось, и мне нужно найти хорошую документацию, учебное пособие или хороший пример, чтобы узнать, как это работает.

Кроме того, одна вещь, которую ранее упомянутый документ вообще не описывает, это как добавить подменю к индикатору. Я надеюсь, что кто-то может пролить некоторый свет на это, а также на то, как интегрировать с индикаторами категории, если это делается с помощью того же инструмента.

Благодарю.

Джо-Эрленд Шинстад
источник

Ответы:

19

Это мой пробный код для gtk3 и appindicator, который создает индикатор для GPaste .

В принципе,

from gi.repository import AppIndicator3 as AppIndicator

для того, чтобы использовать appindicator для приложений gtk3, который предоставляется пакетом gir1.2-appindicator3.

Вот документация AppIndicator3 .

Для Gtk3 pygtk будет устаревшим, и вам придется пройти маршрут GObject-Introspection для разработки приложений Gtk3 на python. Вы можете обратиться к документации PyGObject . Вместо того

import pygtk, gtk, gdk, gobject, pango  

и т. д. вы должны сделать

from gi.repository import Gtk, Gdk, Pango, GObject  

Для изучения рабочего кода вы можете просмотреть Kazam, который перешел на gtk3 из gtk2 и использует appindicator3 .

Также есть пакет, gir1.2-appindicatorкоторый, по-видимому, совпадает с использованием, python-appindicatorпоскольку оба они обеспечивают использование для приложения gtk2, а именно:

from gi.repository import AppIndicator

ИЛИ

import appindicator

Некоторая информация в этом посте также.

sagarchalise
источник
Я пошел с AppIndicator3. Но значит ли это, что AppIndicator 1 - это прямой порт python-appindicator, а AI3 - это новая версия, которая не поддерживается бэкпортом?
Джо-Эрленд Шинстад
Кажется, так. Я загрузил appindicator 0.1 из оболочки python, а затем попытался загрузить appindicator3, который дал мне эту ошибку RepositoryError: Requiring namespace 'Gtk' version '3.0', but '2.0' is already loaded. Похоже, что appindicator 0.1 работает с gtk2, то есть с pygtk и appindicator3 и выше, если таковые имеются с gtk3
sagarchalise
Ах, я понял. Это не версия 3 AI. Это ИИ для GTK3 :)
Джо-Эрленд Шинстад
Я также заметил эту запись в блоге , в которой обсуждается использование AppIndicator3 , что может показаться вам интересным.
Дэвид Планелла
2
Просто обратите внимание, большинство из этих ссылок мертвы.
RobotHumans
10

Вот глупое простое скаффолд-приложение с окном конфигурации, главным окном и индикатором приложения.

#!/usr/bin/env python3.3

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

class MyIndicator:
  def __init__(self, root):
    self.app = root
    self.ind = appindicator.Indicator.new(
                self.app.name,
                "indicator-messages",
                appindicator.IndicatorCategory.APPLICATION_STATUS)
    self.ind.set_status (appindicator.IndicatorStatus.ACTIVE)
    self.menu = Gtk.Menu()
    item = Gtk.MenuItem()
    item.set_label("Main Window")
    item.connect("activate", self.app.main_win.cb_show, '')
    self.menu.append(item)

    item = Gtk.MenuItem()
    item.set_label("Configuration")
    item.connect("activate", self.app.conf_win.cb_show, '')
    self.menu.append(item)

    item = Gtk.MenuItem()
    item.set_label("Exit")
    item.connect("activate", self.cb_exit, '')
    self.menu.append(item)

    self.menu.show_all()
    self.ind.set_menu(self.menu)

  def cb_exit(self, w, data):
     Gtk.main_quit()

class MyConfigWin(Gtk.Window):
  def __init__(self, root):
    super().__init__()
    self.app = root
    self.set_title(self.app.name + ' Config Window')

  def cb_show(self, w, data):
    self.show()

class MyMainWin(Gtk.Window):
  def __init__(self, root):
    super().__init__()
    self.app = root
    self.set_title(self.app.name)

  def cb_show(self, w, data):
    self.show()

class MyApp(Gtk.Application):
  def __init__(self, app_name):
    super().__init__()
    self.name = app_name
    self.main_win = MyMainWin(self)
    self.conf_win = MyConfigWin(self)
    self.indicator = MyIndicator(self)

  def run(self):
    Gtk.main()

if __name__ == '__main__':
  app = MyApp('Scaffold')
  app.run()
RobotHumans
источник
9

На всякий случай, если кому-то это покажется полезным, я сделал минимальный индикатор приложения для Python, GIR и GTK3. Он считывает скорости процессора из / proc / cpuinfo каждые несколько секунд и отображает их.

Смотрите здесь: https://bitbucket.org/cpbotha/indicator-cpuspeed/src

Чарл Бота
источник
8

Вот пример чтения температуры процессора. скопируйте значок с именем temp-icon.png / svg в каталог скриптов

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

def cb_exit(w, data):
   Gtk.main_quit()

def cb_readcputemp(ind_app):
# get CPU temp
   fileh = open(
      '/sys/devices/platform/thinkpad_hwmon/subsystem/devices/coretemp.0/temp1_input',
    'r')
  ind_app.set_label(fileh.read(2), '')
  fileh.close()
  return 1


ind_app = appindicator.Indicator.new_with_path (
  "cputemp-indicator",
   "temp-icon",
   appindicator.IndicatorCategory.APPLICATION_STATUS,
    os.path.dirname(os.path.realpath(__file__)))
ind_app.set_status (appindicator.IndicatorStatus.ACTIVE)

# create a menu
menu = Gtk.Menu()
menu_items = Gtk.MenuItem("Exit")
menu.append(menu_items)
menu_items.connect("activate", cb_exit, '')
menu_items.show()
ind_app.set_menu(menu)
GLib.timeout_add(500, cb_readcputemp, ind_app)
Gtk.main()
Сриваца Канчи
источник