우분투 메이트 용 패널 앱을 작성하려고합니다. 나는 C / C ++과 SDL을 합리적으로 잘 알고 있습니다. Mate-University 패널 앱 github 페이지를 보았지만 제대로 작동하지 못합니다.
패널 앱을 작성하기 쉬운 방법이 있는지 궁금합니다. 사용자 정의 응용 프로그램 실행기를 사용하는 것에 대해 이야기하지 않고 새로운 기능을 패널에 추가하고 싶지만 어떻게 해야할지 모르겠습니다. 패널 앱 작성에 대한 자습서 또는 설명이 도움이 될 수 있습니다.
답변
무슨 일이 이미이 질문을 질문 할 수있는 기회가 될 것으로 보인다 때문에 대답했다 (에, 내가 어떻게했는지 확장 된 설명으로이 질문에 대답 오전 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()
이것이 원칙입니다. 이 답변 의 실제 표시기에서 루프 시간과 표시기 텍스트는 스크립트에서 가져온 보조 모듈에 의해 결정되었지만 주요 아이디어는 동일합니다.