Bu soruyu sorma vesilesinin zaten bir cevabı olduğundan , bu soruyu nasıl yapıldığına dair geniş bir açıklama olarak cevaplıyorum (in python
)
Temel statik gösterge
Ubuntu Mate, 15,10'dan itibaren göstergeleri desteklediğinden, bir gösterge yazmak ve Mate için bir panel uygulaması arasında çok fazla fark yoktur. Bu nedenle, bu bağlantı , API python
kullanarak temel bir gösterge için iyi bir başlangıç noktasıdır AppIndicator3
. Bağlantı güzel bir başlangıçtır, ancak metnin (veya simgenin) nasıl güncelleneceğini , göstergede metnin nasıl gösterileceği hakkında herhangi bir bilgi sağlamaz . Bununla birlikte, birkaç ilavelerle, bu, aşağıdaki gibi bir göstergenin temel bir "çerçevesine" yol açar. Bir simge, bir metin etiketi ve bir menü gösterecektir:
#!/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()
Satırda AppIndicator3.IndicatorCategory.OTHER
, bu (kısmen modası geçmiş) bağlantıda açıklandığı gibi kategori tanımlanır . Doğru kategorinin ayarlanması önemlidir, ao göstergeyi panelde uygun bir konuma getirmek için.
Ana zorluk; gösterge metnini ve / veya simgesini güncelleme
Asıl zorluk, temel bir göstergenin nasıl yazılacağı değil, göstergenizin metnini ve / veya simgesini periyodik olarak nasıl güncelleyeceğinizdir , çünkü (metinsel) zamanı göstermesini istersiniz. Göstergenin düzgün çalışması threading
için, arayüzü periyodik olarak güncellemek üzere ikinci bir işlem başlatmak için kullanamayız . Aslında yapabiliriz, ancak daha uzun vadede öğrendiğim gibi çatışmalara yol açacaktır.
İşte burada GObject
o konur olarak, şunları geliyor bu (aynı zamanda modası geçmiş) linkte :
gobject.threads_init()
başvurunun başlatılmasında çağrı . Ardından, iş parçacıklarınızı normal olarak başlatırsınız, ancak iş parçacıklarının hiçbir zaman doğrudan GUI görevleri yapmadığından emin olun. Bunun yerine, gobject.idle_add
ana iş parçacığında yürütülen GUI görevini zamanlamak için kullanın
Biz değiştirdiğinizde gobject.threads_init()
tarafından GObject.threads_init()
ve gobject.idle_add
tarafından GObject.idle_add()
, biz hemen hemen bir iş parçacığı çalıştırmak için nasıl güncel sürümüne sahip Gtk
bir uygulama. Artan sayıda Maymun gösteren basitleştirilmiş bir örnek:
#!/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()
İlke bu. Gerçek göstergesi olarak bu cevap , döngü süresi ve gösterge metin hem komut ithal ikincil modül tarafından belirlendi, ancak ana fikri aynıdır.