पायथन, जीआईआर और जीटीके 3 के साथ संकेतक लिखना


18

मैं एक एप्लिकेशन लिख रहा हूं जिसे एक संकेतक का उपयोग करने की आवश्यकता है। मैंने इस दस्तावेज़ को संदर्भ के रूप में उपयोग करते हुए PyGTK और GTK2 का उपयोग करते हुए अतीत में किया है: https://wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators#Python_version

हालाँकि, यह केवल PyGTK और GTK2 के साथ काम करता है। तब से चीजें बदल गई हैं, और मुझे यह जानने के लिए कुछ अच्छे दस्तावेज, एक ट्यूटोरियल या एक अच्छा उदाहरण खोजने की आवश्यकता है कि यह कैसे काम करता है।

इसके अलावा, एक बात जो पहले उल्लेखित दस्तावेज़ में वर्णित नहीं है, वह यह है कि एक संकेतक में उप-मेनू कैसे जोड़ा जाए। मुझे आशा है कि कोई व्यक्ति इस पर कुछ प्रकाश डाल सकता है, साथ ही साथ श्रेणी संकेतक के साथ कैसे एकीकृत किया जा सकता है यदि वह उसी उपकरण का उपयोग कर रहा हो।

धन्यवाद।

जवाबों:


19

यह gtk3 और appindicator के लिए मेरा परीक्षण कोड है जो GPaste के लिए एक संकेतक बनाता है ।

मूल रूप से,

from gi.repository import AppIndicator3 as AppIndicator

gtk3 अनुप्रयोगों के लिए appindicator का उपयोग करने के लिए जो पैकेज द्वारा प्रदान किया गया है gir1.2-appindicator3

यहाँ AppIndicator3 प्रलेखन है।

PyGTK Gtk3 के लिए बहिष्कृत हो जाएगा और आप के माध्यम से जाना है GObject-आत्मनिरीक्षण अजगर में Gtk3 अनुप्रयोगों के विकास के लिए मार्ग। आप PyGObject प्रलेखन का उल्लेख कर सकते हैं । के बजाय

import pygtk, gtk, gdk, gobject, pango  

आदि आपको करना चाहिए

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

एक कामकाजी कोड का अध्ययन करने के लिए, आप कज़ाम को देख सकते हैं, जो gtk2 से gtk3 में स्थानांतरित हो गया है और appindicator3 का उपयोग करता है ।

एक पैकेज है gir1.2-appindicatorजो जैसा लगता है वैसा ही उपयोग करने लगता है python-appindicatorक्योंकि वे दोनों gtk2 एप्लायंस के लिए उपयोग प्रदान करते हैं जो है:

from gi.repository import AppIndicator

या

import appindicator

कुछ जानकारी इस ब्लॉग पोस्ट में भी।


मैं AppIndicator3 के साथ गया था। लेकिन क्या इसका मतलब यह है कि AppIndicator 1, अजगर-एपिंडिलेटर का प्रत्यक्ष पोर्ट है जबकि AI3 एक नया संस्करण है जो बैकपोर्ट नहीं है?
जो-एर्लेंड शिनस्टैड

ऐसा लगता है। मैंने अजगर शेल से ऐपिंडिक्टर 0.1 लोड किया और फिर ऐपिंडिलेटर 3 लोड करने की कोशिश की जिसने मुझे यह त्रुटि दी RepositoryError: Requiring namespace 'Gtk' version '3.0', but '2.0' is already loaded। तो ऐसा लगता है कि ऐपिंडिक्टर 0.1 gtk2 के साथ काम करता है अर्थात pygtk और appindicator3 और इसके बाद का कोई भी वर्क gt3 के साथ काम करता है
sagarchalise

आह, मैं समझ गया। यह AI का संस्करण 3 नहीं है। यह
GTK3 के

मैंने इस ब्लॉग प्रविष्टि पर भी ध्यान दिया है , जो AppIndicator3 के उपयोग पर चर्चा करता है , जो आपको दिलचस्प लग सकता है।
डेविड प्लेनेला

2
बस एक नोट, इनमें से अधिकांश लिंक मृत हैं।
रोबोट ह्यूमन्स

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

बस अगर कोई इसे उपयोगी समझ सकता है, तो मैंने पायथन, जीआईआर और जीटीके 3 के साथ एक न्यूनतम ऐप संकेतक बनाया। यह हर कुछ सेकंड में सीपीयू की गति / 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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.