답변:
무슨 일이 이미이 질문을 질문 할 수있는 기회가 될 것으로 보인다 때문에 대답했다 (에, 내가 어떻게했는지 확장 된 설명으로이 질문에 대답 오전 python
)
15,10의 Ubuntu Mate는 지표를 지원하므로 지표 작성과 Mate 용 패널 앱 사이에는 큰 차이가 없습니다. 따라서이 링크 는 python
의 AppIndicator3
API를 사용하여의 기본 지표에 대한 좋은 시작점 입니다. 링크는 좋은 시작이지만 텍스트 (또는 아이콘) 를 업데이트 하는 방법은 물론 표시기에 텍스트를 표시하는 방법에 대한 정보는 제공하지 않습니다 . 그럼에도 불구하고 몇 가지 추가로 인해 아래와 같이 표시기의 기본 "프레임"이 나타납니다. 아이콘, 텍스트 레이블 및 메뉴가 표시됩니다.
#!/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
에서 카테고리는 이 (일부 구식) 링크 에 설명 된대로 정의 됩니다 . 올바른 범주를 설정하는 것이 중요합니다. ao는 패널에서 적절한 위치에 표시기를 두십시오.
실제 과제는 기본 지표를 작성하는 방법이 아니라 (텍스트) 시간을 표시하도록하기 위해 지표의 텍스트 및 / 또는 아이콘 을 주기적으로 업데이트 하는 방법 입니다. 인디케이터가 제대로 작동하도록 threading
하기 위해 인터페이스를 주기적으로 업데이트하는 두 번째 프로세스를 시작하는 데 사용할 수 없습니다 . 글쎄, 실제로 우리는 할 수 있지만, 더 오래 달리면 내가 알다시피 갈등이 생길 것입니다.
이 (또한 오래된) 링크에GObject
넣을 때의 위치 는 다음과 같습니다 .
gobject.threads_init()
응용 프로그램 초기화시 호출합니다 . 그런 다음 스레드를 정상적으로 시작하지만 스레드가 GUI 작업을 직접 수행하지 않도록하십시오. 대신 gobject.idle_add
메인 스레드에서 GUI 작업이 실행되도록 예약 하는 데 사용 합니다.
gobject.threads_init()
by GObject.threads_init()
및 gobject.idle_add
by로 교체 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()
이것이 원칙입니다. 이 답변 의 실제 표시기에서 루프 시간과 표시기 텍스트는 스크립트에서 가져온 보조 모듈에 의해 결정되었지만 주요 아이디어는 동일합니다.