57 lines
2.4 KiB
Python
57 lines
2.4 KiB
Python
import pystray
|
|
from view.ui_utils import asset_loader
|
|
|
|
class SystemTray:
|
|
"""
|
|
시스템 트레이 아이콘 및 메뉴를 관리하는 클래스.
|
|
pystray 라이브러리를 사용하여 트레이 아이콘을 생성하고 백그라운드 실행을 지원합니다.
|
|
"""
|
|
def __init__(self, controller):
|
|
self.controller = controller
|
|
self.icon = None
|
|
|
|
def create_modern_icon(self):
|
|
"""에셋 로더를 통해 Tray 아이콘(PIL Image)을 생성하여 반환합니다."""
|
|
return asset_loader.get_tray_icon_image()
|
|
|
|
def run(self, on_check, on_update, on_list, on_settings, on_quit):
|
|
"""
|
|
트레이 아이콘을 실행하고 메뉴 이벤트를 바인딩합니다.
|
|
|
|
Args:
|
|
on_check (func): '지금 확인' 메뉴 핸들러
|
|
on_update (func): '업데이트 확인' 메뉴 핸들러
|
|
on_list (func): 'VOC 모니터링 열기' 메뉴 핸들러
|
|
on_settings (func): '설정' 메뉴 핸들러
|
|
on_quit (func): '종료' 메뉴 핸들러
|
|
"""
|
|
# 메뉴 구성
|
|
menu = (
|
|
pystray.MenuItem('VOC 모니터링 열기', lambda *args: on_list()), # 메인 기능
|
|
pystray.Menu.SEPARATOR,
|
|
pystray.MenuItem('지금 확인 (수동)', lambda *args: on_check()),
|
|
pystray.MenuItem('업데이트 확인', lambda *args: on_update()),
|
|
pystray.MenuItem('설정', lambda *args: on_settings()),
|
|
pystray.MenuItem('종료', lambda *args: on_quit()),
|
|
)
|
|
# 아이콘 로드 및 실행
|
|
self.icon = pystray.Icon(
|
|
"VOC_Monitor",
|
|
self.create_modern_icon(),
|
|
"VOC 알리미",
|
|
menu
|
|
)
|
|
self.icon.run()
|
|
|
|
def stop(self):
|
|
"""트레이 아이콘을 종료하고 리소스를 정리합니다."""
|
|
if self.icon:
|
|
self.icon.stop()
|
|
|
|
def show_notification(self, title, msg, voc_id=None):
|
|
"""커스텀 알림 창 표시 (메인 스레드에서 실행)"""
|
|
# controller.root.after를 사용하여 메인 스레드에서 UI 생성 보장
|
|
# 순환 참조 방지를 위해 지역 import 사용
|
|
from view.components.notification import NotificationView
|
|
self.controller.root.after(0, lambda: NotificationView(self.controller, title=title, msg=msg, voc_id=voc_id))
|