[Python] Debian 11 (bullseye) 에 트레이 아이콘 처리하기 Develop Tip

휴우 관련 정보를 몇번 삽질하다가 해결했습니다.
다른 분들은 시행착오를 안하시기를 바라며...

데비안 11 (불스아이) 에 트레이 관련 라이브러리가,
libayatanaapppindicator 로 변경되었다 하네요.

우선은 다음과 같은 라이브러리가 있는지 확인하구요,

$ apt list -i *appindicator*
Listing... 완료
gir1.2-ayatanaappindicator3-0.1/stable,now 0.5.5-2 amd64 [installed]
libayatana-appindicator3-1/stable,now 0.5.5-2 amd64 [installed,automatic]
libayatana-appindicator3-dev/stable,now 0.5.5-2 amd64 [installed]

없으면 해당 라이브러러리를 apt로 설치합니다.

다음은 requirements.txt 내용입니다.

# sudo apt install python3-dev
# sudo apt install libgirepository1.0-dev
PyGObject
xmltodict

첫 두줄의 코멘트는 PyGObject를 소스에서 빌드하는데 필요한 것이었습니다.

아래 샘플은 

# This code was adapted from an example for a tutorial on Ubuntu Unity/Gnome AppIndicators:
# http://candidtim.github.io/appindicator/2014/09/13/ubuntu-appindicator-step-by-step.html

의 내용을 참조하여 돌도록 수정한 것입니다.

import gi
import signal
import json
import xmltodict
import urllib.request

gi.require_version('Gtk', '3.0')
# gi.require_version('AppIndicator3', '0.1')
gi.require_version('AyatanaAppIndicator3', '0.1')
gi.require_version('Notify', '0.7')
from gi.repository import Gtk as gtk
# from gi.repository import AppIndicator3 as appindicator
from gi.repository import AyatanaAppIndicator3 as appindicator
from gi.repository import Notify as notify

APPINDICATOR_ID = 'cndbappindicator'

def main():
    indicator = appindicator.Indicator.new(
            APPINDICATOR_ID,
            "network-idle-symbolic",
            appindicator.IndicatorCategory.APPLICATION_STATUS)
    indicator.set_status(appindicator.IndicatorStatus.ACTIVE)
    indicator.set_menu(build_menu())
    notify.init(APPINDICATOR_ID)
    gtk.main()

def build_menu():
    menu = gtk.Menu()
    item_joke = gtk.MenuItem(label='Joke')
    item_joke.connect('activate', joke)
    menu.append(item_joke)
    item_geoip = gtk.MenuItem(label='Geoip')
    item_geoip.connect('activate', geoip)
    menu.append(item_geoip)
    item_quit = gtk.MenuItem(label='Quit')
    item_quit.connect('activate', quit)
    menu.append(item_quit)
    menu.show_all()
    return menu

def fetch_joke():
    request = urllib.request.Request('http://api.icndb.com/jokes/random?limitTo=[nerdy]')
    response = urllib.request.urlopen(request)
    joke = json.loads(response.read())['value']['joke']
    return joke

def joke(_):
    notify.Notification.new("Joke", fetch_joke(), None).show()

def fetch_geoip():
    request = urllib.request.Request('https://geoip.ubuntu.com/lookup')
    response = urllib.request.urlopen(request)
    payload = xmltodict.parse(response.read())
    return json.dumps(payload, indent=4, separators=(',', ': '))

def geoip(_):
    notify.Notification.new("Geoip", fetch_geoip(), None).show()

def quit(_):
    notify.uninit()
    gtk.main_quit()

if __name__ == "__main__":
    signal.signal(signal.SIGINT, signal.SIG_DFL)
    main()

데비안 11이 되면서 

# gi.require_version('AppIndicator3', '0.1')
부분이
gi.require_version('AyatanaAppIndicator3', '0.1')
이렇게 하면 해결되었습니다.


어느 분께는 도움이 되셨기를 ..

덧글

댓글 입력 영역

구글애드텍스트