मैं एक गतिशील रूप से अपडेट किया गया पैनल ऐप / संकेतक कैसे लिख सकता हूं?


12

मैं ubuntu मेट के लिए कुछ पैनल ऐप लिखने की कोशिश कर रहा हूं। मुझे पता है कि C / C ++, और SDL यथोचित है। मैंने मेट-यूनिवर्सिटी पैनल ऐप्स गिथब पृष्ठ देखा है, लेकिन मैं इसे ठीक से काम करने के लिए नहीं पा सकता / इसके साथ एक समय होने पर Im।

मैं बस सोच रहा हूं, अगर पैनल ऐप लिखने के लिए कुछ आसान एवेन्यू है? मैं कस्टम एप्लिकेशन लॉन्चर का उपयोग करने के बारे में बात नहीं कर रहा हूं, मैं पैनल में नई कार्यक्षमता जोड़ना चाहूंगा, लेकिन मुझे यकीन नहीं है कि कैसे। पैनल ऐप्स लिखने के बारे में एक ट्यूटोरियल या विवरण वास्तव में मददगार हो सकता है।

जवाबों:


16

चूँकि इस प्रश्न को पूछने का अवसर क्या है , इसका उत्तर पहले से ही है , मैं इस प्रश्न का उत्तर एक विस्तृत विवरण के रूप में दे रहा हूँ कि यह कैसे किया गया ( python)

बेसिक स्टैटिक इंडिकेटर

चूंकि उबंटू मेट, 15,10 से, संकेतक का समर्थन करता है, इसलिए सूचक लिखने और मेट के लिए एक पैनल ऐप के बीच बहुत अंतर नहीं है। इसलिए, यह लिंक एपीआई pythonका उपयोग करके, एक मूल संकेतक के लिए एक अच्छा प्रारंभिक बिंदु AppIndicator3है। लिंक एक अच्छी शुरुआत है, लेकिन संकेतक पर पाठ दिखाने के तरीके के बारे में कोई जानकारी नहीं देता है, अकेले पाठ (या आइकन) को कैसे अपडेट करें। फिर भी, कुछ परिवर्धन के साथ, यह नीचे एक संकेतक के मूल "फ्रेम" की ओर जाता है। यह एक आइकन, एक टेक्स्ट लेबल और एक मेनू दिखाएगा:

यहाँ छवि विवरण दर्ज करें

#!/usr/bin/env python3
import signal
import gi
gi.require_version('Gtk', '3.0')
gi.require_version('AppIndicator3', '0.1')
from gi.repository import Gtk, AppIndicator3

class Indicator():
    def __init__(self):
        self.app = 'test123'
        iconpath = "/opt/abouttime/icon/indicator_icon.png"
        self.indicator = AppIndicator3.Indicator.new(
            self.app, iconpath,
            AppIndicator3.IndicatorCategory.OTHER)
        self.indicator.set_status(AppIndicator3.IndicatorStatus.ACTIVE)       
        self.indicator.set_menu(self.create_menu())
        self.indicator.set_label("1 Monkey", self.app)

    def create_menu(self):
        menu = Gtk.Menu()
        # menu item 1
        item_1 = Gtk.MenuItem('Menu item')
        # item_about.connect('activate', self.about)
        menu.append(item_1)
        # separator
        menu_sep = Gtk.SeparatorMenuItem()
        menu.append(menu_sep)
        # quit
        item_quit = Gtk.MenuItem('Quit')
        item_quit.connect('activate', self.stop)
        menu.append(item_quit)

        menu.show_all()
        return menu

    def stop(self, source):
        Gtk.main_quit()

Indicator()
signal.signal(signal.SIGINT, signal.SIG_DFL)
Gtk.main()

लाइन में AppIndicator3.IndicatorCategory.OTHER, श्रेणी को परिभाषित किया गया है, जैसा कि इस (आंशिक रूप से पुराना) लिंक में समझाया गया है । पैनल में उपयुक्त स्थिति में संकेतक लगाने के लिए सही श्रेणी निर्धारित करना महत्वपूर्ण है, एओ।

मुख्य चुनौती; संकेतक पाठ और / या आइकन को कैसे अपडेट करें

असली चुनौती यह नहीं है कि बुनियादी संकेतक कैसे लिखें, बल्कि अपने संकेतक के पाठ और / या आइकन को समय-समय पर अपडेट कैसे करें, क्योंकि आप इसे (पाठ) समय दिखाना चाहते हैं। संकेतक को ठीक से काम करने के लिए, हम threadingसमय-समय पर इंटरफ़ेस को अपडेट करने के लिए दूसरी प्रक्रिया शुरू करने के लिए उपयोग नहीं कर सकते हैं । ठीक है, वास्तव में हम कर सकते हैं, लेकिन लंबे समय तक, यह संघर्षों को जन्म देगा, जैसा कि मुझे पता चला है।

यहां वह है, जहां GObject, इसमें, जैसा कि इस (भी पुराना) लिंक में रखा गया है :

gobject.threads_init()एप्लाइटन इनिशियलाइज़ेशन पर कॉल करें । फिर आप सामान्य रूप से अपने थ्रेड लॉन्च करते हैं, लेकिन सुनिश्चित करें कि थ्रेड सीधे कोई भी GUI कार्य नहीं करते हैं। इसके बजाय, आप gobject.idle_addमुख्य सूत्र में निष्पादित GUI कार्य को शेड्यूल करने के लिए उपयोग करते हैं

जब हम बदलने के gobject.threads_init() द्वारा GObject.threads_init()और gobject.idle_addद्वारा GObject.idle_add(), हम काफी है कि कैसे एक में धागे को चलाने के लिए के अद्यतित संस्करण है Gtkआवेदन। एक सरल उदाहरण, बंदरों की बढ़ती संख्या दिखा रहा है:

यहाँ छवि विवरण दर्ज करें

#!/usr/bin/env python3
import signal
import gi
gi.require_version('Gtk', '3.0')
gi.require_version('AppIndicator3', '0.1')
from gi.repository import Gtk, AppIndicator3, GObject
import time
from threading import Thread

class Indicator():
    def __init__(self):
        self.app = 'test123'
        iconpath = "/opt/abouttime/icon/indicator_icon.png"
        self.indicator = AppIndicator3.Indicator.new(
            self.app, iconpath,
            AppIndicator3.IndicatorCategory.OTHER)
        self.indicator.set_status(AppIndicator3.IndicatorStatus.ACTIVE)       
        self.indicator.set_menu(self.create_menu())
        self.indicator.set_label("1 Monkey", self.app)
        # the thread:
        self.update = Thread(target=self.show_seconds)
        # daemonize the thread to make the indicator stopable
        self.update.setDaemon(True)
        self.update.start()

    def create_menu(self):
        menu = Gtk.Menu()
        # menu item 1
        item_1 = Gtk.MenuItem('Menu item')
        # item_about.connect('activate', self.about)
        menu.append(item_1)
        # separator
        menu_sep = Gtk.SeparatorMenuItem()
        menu.append(menu_sep)
        # quit
        item_quit = Gtk.MenuItem('Quit')
        item_quit.connect('activate', self.stop)
        menu.append(item_quit)

        menu.show_all()
        return menu

    def show_seconds(self):
        t = 2
        while True:
            time.sleep(1)
            mention = str(t)+" Monkeys"
            # apply the interface update using  GObject.idle_add()
            GObject.idle_add(
                self.indicator.set_label,
                mention, self.app,
                priority=GObject.PRIORITY_DEFAULT
                )
            t += 1

    def stop(self, source):
        Gtk.main_quit()

Indicator()
# this is where we call GObject.threads_init()
GObject.threads_init()
signal.signal(signal.SIGINT, signal.SIG_DFL)
Gtk.main()

यही सिद्धांत है। इस उत्तर में वास्तविक संकेतक में , लूप समय और संकेतक पाठ दोनों को स्क्रिप्ट में आयातित एक माध्यमिक मॉड्यूल द्वारा निर्धारित किया गया था, लेकिन मुख्य विचार समान है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.