Запис індикаторів за допомогою 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 .

pygtk буде застарілим для Gtk3, і вам доведеться пройти маршрут 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

Деякі відомості також у цій публікації в блозі .


Я поїхав із 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. Це 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()

9

На всякий випадок, якщо комусь це стане корисним, я зробив мінімальний показник програми з Python, GIR та GTK3. Він зчитує швидкості процесора з / proc / cpuinfo кожні кілька секунд і відображає їх.

Дивіться тут: https://bitbucket.org/cpbotha/indicator-cpuspeed/src


8

Ось приклад зчитування температури CPU. скопіюйте піктограму з іменем 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()
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.