GNU/Linux >> Belajar Linux >  >> Ubuntu

Bagaimana Cara Menulis Aplikasi / Indikator Panel yang Diperbarui Secara Dinamis?

Saya mencoba menulis beberapa aplikasi panel untuk ubuntu Mate.
Saya tahu C/C++, dan SDL dengan cukup baik.
Saya telah melihat halaman github aplikasi panel Mate-University, tetapi saya tidak bisa membuatnya berfungsi benar / Saya memiliki waktu dengan itu.

Saya hanya ingin tahu, apakah ada cara mudah untuk menulis aplikasi panel? Saya tidak berbicara tentang menggunakan peluncur aplikasi khusus, saya ingin menambahkan fungsionalitas baru, ke panel, tetapi saya tidak yakin bagaimana caranya. Tutorial, atau deskripsi tentang menulis aplikasi panel bisa sangat membantu.

Jawaban Terbaik

Karena apa yang tampaknya menjadi kesempatan untuk mengajukan pertanyaan ini sudah memiliki jawaban, saya menjawab pertanyaan ini sebagai penjelasan panjang tentang bagaimana hal itu dilakukan (dalam python )

Dasar statis indikator

Karena Ubuntu Mate, dari 15,10, mendukung indikator, tidak ada banyak perbedaan antara menulis indikator dan aplikasi panel untuk Mate. Oleh karena itu, tautan ini adalah titik awal yang baik untuk indikator dasar di python , menggunakan AppIndicator3 API. Tautan adalah awal yang bagus, tetapi tidak memberikan informasi apa pun tentang cara menampilkan teks pada indikator, apalagi cara memperbarui teks (atau ikon). Namun demikian, dengan beberapa tambahan, ini mengarah pada "bingkai" dasar dari sebuah indikator seperti di bawah ini. Ini akan menampilkan ikon, label teks dan menu:

#!/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 = "//eadn-wc01-5196795.nxedge.io/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()

Di baris AppIndicator3.IndicatorCategory.OTHER , kategorinya ditentukan, seperti yang dijelaskan dalam tautan ini (sebagian sudah ketinggalan zaman). Menetapkan kategori yang tepat itu penting, a.o. untuk menempatkan indikator pada posisi yang sesuai di panel.

Tantangan utama; cara memperbarui teks dan/atau ikon indikator

Tantangan sebenarnya bukanlah bagaimana menulis indikator dasar, tetapi bagaimana secara berkala update teks dan/atau ikon indikator Anda, karena Anda ingin menampilkan waktu (tekstual). Agar indikator berfungsi dengan baik, kita tidak bisa begitu saja menggunakan threading untuk memulai proses kedua untuk memperbarui antarmuka secara berkala. Sebenarnya bisa, tapi dalam jangka panjang, itu akan menimbulkan konflik, seperti yang saya ketahui.

Di sinilah GObject masuk, ke, seperti yang dimasukkan ke dalam tautan ini (juga usang):

Terkait:Bagaimana cara menunjukkan seni ascii di bagian atas terminal saat dibuka?

panggil gobject.threads_init() pada inisialisasi aplikasi. Kemudian Anda meluncurkan utas Anda secara normal, tetapi pastikan utas tidak pernah melakukan tugas GUI secara langsung. Sebagai gantinya, Anda menggunakan gobject.idle_add untuk menjadwalkan tugas GUI untuk dieksekusi di utas utama

Saat kita mengganti gobject.threads_init() oleh GObject.threads_init() dan gobject.idle_add oleh GObject.idle_add() , kami cukup banyak memiliki versi terbaru tentang cara menjalankan utas di Gtk aplikasi. Contoh sederhana, menunjukkan peningkatan jumlah Monyet:

#!/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 = "//eadn-wc01-5196795.nxedge.io/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()

Itulah prinsipnya. Dalam indikator aktual dalam jawaban ini, waktu pengulangan dan teks indikator ditentukan oleh modul sekunder, yang diimpor dalam skrip, tetapi gagasan utamanya sama.


Ubuntu
  1. Cara Memasang Indikator SysMonitor di Ubuntu &Debian

  2. Bagaimana Cara Mendaftar Nama Panel Gnome-control-center?

  3. Bagaimana Cara Menambahkan Indikator-datetime Ke Panel?

  1. Cara Menggunakan Applet Indikator di GNOME Shell

  2. Bagaimana Cara Memberikan Izin Menulis Di Samba?

  3. Bagaimana Cara Menghapus Panel Gnome?

  1. Cara Menginstal WSL 2 di Windows 10 (Diperbarui)

  2. Cara menginstal ReactJS di Ubuntu 20.04

  3. Cara Menginstal Aplikasi Pesan Sinyal di Ubuntu 20.04