Python, GIR 및 GTK3로 지표 작성


18

표시기를 사용해야하는 응용 프로그램을 작성 중입니다. https://wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators#Python_version 이 문서를 참조하여 PyGTK 및 GTK2를 사용하여 과거 에이 작업을 수행했습니다.

그러나 PyGTK 및 GTK2에서만 작동합니다. 그 이후로 상황이 바뀌었고 좋은 문서, 자습서 또는 작동 방법을 배우는 좋은 예를 찾아야합니다.

또한 앞에서 언급 한 문서에서 전혀 설명하지 않은 것은 지표에 하위 메뉴를 추가하는 방법입니다. 같은 도구를 사용하여 카테고리 표시기를 통합하는 방법과 누군가 이것에 대해 밝힐 수 있기를 바랍니다.

감사.

답변:


19

이것은 을위한 지표 생성 gtk3 및 appindicator 내 시험 코드 GPaste를 .

원래,

from gi.repository import AppIndicator3 as AppIndicator

package로 제공되는 gtk3 어플리케이션에 appindicator를 사용하기 위해 gir1.2-appindicator3.

다음은 AppIndicator3 설명서입니다.

pygtk 는 Gtk3에서 더 이상 사용되지 않으며 파이썬에서 Gtk3 응용 프로그램을 개발하려면 GObject-Introspection 경로를 거쳐야합니다. PyGObject 문서를 참조 할 수 있습니다 . 대신에

import pygtk, gtk, gdk, gobject, pango  

당신이해야 할 등

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

작업 코드를 공부하고 들어 볼 수 Kazam GTK2 및 용도에서 gtk3로 이동 appindicator3을 .

패키지 는 gtk2 적용에 대한 사용법을 제공 gir1.2-appindicator하므로 다음과 같이 사용하는 python-appindicator것과 동일한 것으로 보입니다 .

from gi.repository import AppIndicator

또는

import appindicator

이 블로그 게시물의 일부 정보 도 있습니다.


나는 AppIndicator3와 함께 갔다. 그러나 이것은 AppIndicator 1이 python-appindicator의 직접 포트이고 AI3가 백 포트되지 않은 새로운 버전이라는 것을 의미합니까?
Jo-Erlend Schinstad

그렇게 보입니다. 파이썬 쉘에서 appindicator 0.1을로드 한 다음 appindicator3를로드하려고 시도 하여이 오류가 발생했습니다 RepositoryError: Requiring namespace 'Gtk' version '3.0', but '2.0' is already loaded. 따라서 gtk3과 함께 작동하는 경우 appindicator 0.1이 gtk2, 즉 pygtk 및 appindicator3 이상에서 작동하는 것 같습니다
sagarchalise

아, 알겠다 AI의 버전 3이 아닙니다. GTK3에 대한이의 AI :
조 - Erlend Schinstad


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


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()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.