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):
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.