আমি কীভাবে ডায়নামিক্যালি আপডেট হওয়া প্যানেল অ্যাপ / ইন্ডিকেটর লিখতে পারি?


12

আমি উবুন্টু মেটের জন্য কয়েকটি প্যানেল অ্যাপ্লিকেশন লেখার চেষ্টা করছি। আমি সি / সি ++, এবং এসডিএল যুক্তিসঙ্গতভাবে জানি। আমি মেট-ইউনিভার্সিটি প্যানেল অ্যাপস গিথুব পৃষ্ঠাটি দেখেছি, তবে আমি এটি সঠিকভাবে কাজ করতে পারি না / আমি এটির সাথে কিছুটা সময় নিচ্ছি।

আমি শুধু ভাবছি, প্যানেল অ্যাপস লেখার জন্য যদি কিছু সহজ উপায় থাকে? আমি কাস্টম অ্যাপ্লিকেশন লঞ্চারটি ব্যবহার করার বিষয়ে কথা বলছি না, আমি প্যানেলে নতুন কার্যকারিতা যুক্ত করতে চাই, তবে কীভাবে করবেন তা আমি নিশ্চিত নই। প্যানেল অ্যাপ্লিকেশন লেখার বিষয়ে একটি টিউটোরিয়াল বা বিবরণ সত্যই সহায়ক হতে পারে।

উত্তর:


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()অ্যাপ্লিকেশন শুরুতে কল করুন । তারপরে আপনি আপনার থ্রেডগুলি সাধারণত চালু করেন তবে নিশ্চিত করুন যে থ্রেডগুলি কখনই সরাসরি কোনও জিইউআই কাজ না করে। পরিবর্তে, আপনি gobject.idle_addমূল থ্রেডে এক্সিকিউট করার জন্য জিইউআই টাস্ক শিডিউল করতে ব্যবহার করেন

আমরা যখন প্রতিস্থাপন 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()

এটাই নীতি। এই উত্তরের প্রকৃত সূচকটিতে লুপ সময় এবং সূচক পাঠ্য উভয়ই স্ক্রিপ্টে আমদানি করা একটি গৌণ মডিউল দ্বারা নির্ধারিত হয়েছিল, তবে মূল ধারণাটি একই।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.