Tkinter System Tray.

2024. 4. 6. 23:40GUI/tkinter

요약 : 이 튜토리얼에서는 Tkinter 시스템 트레이 애플리케이션을 개발하는 방법을 배웁니다.

 

Tkinter 시스템 트레이 응용프로그램 소개

 

시스템 트레이 응용 프로그램은 백그라운드에서 실행되고 일부 기능에 대한 빠른 액세스를 제공하는 응용 프로그램 유형입니다.

시스템 트레이 애플리케이션은 일반적으로 Windows, macOS 또는 Linux 데스크톱 환경의 작업 표시줄에 있는 알림 영역이나 시스템 트레이에 작은 아이콘으로 표시됩니다.

시스템 트레이 응용 프로그램의 일반적인 예로는 바이러스 백신 소프트웨어, 인스턴트 메시징 클라이언트 또는 시스템 모니터링 소프트웨어가 있습니다.

사용자는 시스템 트레이 응용 프로그램을 클릭하여 메뉴에 액세스하고 특정 작업을 수행함으로써 상호 작용할 수 있습니다.

Tkinter에는 시스템 트레이 응용 프로그램에 대한 기본 지원이 부족하지만 PyStray 타사 라이브러리를 사용하여 만들 수 있습니다.

 

Tkinter 시스템 트레이 적용 예

 

Tkinter 및 PyStray 패키지를 사용하여 시스템 트레이 응용 프로그램을 만드는 데는 다음 단계가 포함됩니다.

 

1단계. Pystray 및 Pillow 라이브러리 설치

 

pip 명령을 사용하여 Pystray 및 Pillow 라이브러리를 설치합니다. Pystray를 사용하면 트레이 애플리케이션을 만들 수 있고 Pillow를 사용하면 시스템 트레이에 배치되는 아이콘을 디자인할 수 있습니다.

 
!pip install pystray pillow
 

2단계. Tkinter 시스템 트레이 애플리케이션 생성

 

Python 스크립트를 작성하고 다음 코드를 사용하십시오.

 

아래 코드를 실행하는 데 필요한 app.ico는 여기에서 다운로드할 수 있습니다.

 

 

import tkinter as tk
import pystray
from PIL import Image


class MyApp(tk.Tk):
    def __init__(self):
        super().__init__()

        self.title("System Tray App")
        self.geometry('500x250')
        self.protocol('WM_DELETE_WINDOW', self.minimize_to_tray)
    
    def minimize_to_tray(self):
        self.withdraw()
        image = Image.open("app.ico")
        menu = (pystray.MenuItem('Quit',  self.quit_window), 
                pystray.MenuItem('Show',self.show_window))
        icon = pystray.Icon("name", image, "My App", menu)
        icon.run()

    def quit_window(self, icon):
        icon.stop()
        self.destroy()

    def show_window(self, icon):
        icon.stop()
        self.after(0,self.deiconify)

if __name__ == "__main__":
    app = MyApp()
    app.mainloop()

 

 

동작 방식.

먼저 필요한 라이브러리를 가져옵니다.
 
import tkinter as tk
import pystray
from PIL import Image
 

둘째, tk.Tk 클래스를 확장하는 새 MyApp 클래스를 정의합니다. 생성자 __init__()에서 닫기 이벤트를 minimize_to_tray() 메소드와 바인딩합니다.

 
self.protocol('WM_DELETE_WINDOW', self.minimize_to_tray)
 

닫기 버튼을 클릭하면, 시스템 트레이 아이콘을 생성하는 minimize_to_tray() 메소드가 실행됩니다.

셋째, 기본 창을 시스템 트레이로 최소화하는 minimize_to_tray() 메소드를 정의합니다.

 
def minimize_to_tray(self):
    self.withdraw()
    image = Image.open("app.ico")
    menu = (pystray.MenuItem('Quit',  self.quit_window), 
            pystray.MenuItem('Show',self.show_window))
    icon = pystray.Icon("name", image, "My App", menu)
    icon.run()
 

메소드에서:

self.withdraw()는 기본 창을 파괴하지 않고 숨깁니다. 이는 기본 창을 시스템 트레이로 최소화하는 데 필요한 단계입니다.

 
def minimize_to_tray(self):
    # Hide the main window
    self.withdraw()
 

다음은 시스템 트레이의 아이콘으로 사용될 app.ico를 부르는 Image 클래스의 open() 메서드를 호출합니다.

 
    # Open the image for the system tray icon
    image = Image.open("app.ico")
 

다음은 두 개의 PyStray MenuItem 개체가 포함된 시스템 트레이 아이콘에 대한 메뉴를 정의합니다.

 
    menu = (pystray.MenuItem('Quit', self.quit_window), 
            pystray.MenuItem('Show', self.show_window))
 

메뉴 항목 Quit 및 Show는 각각 self.quit_window 및 self.show_window 메소드와 연관되어 있습니다.

다음 줄은 지정된 이미지와 메뉴가 포함된 PyStray 아이콘을 만듭니다.

 
    icon = pystray.Icon("name", image, "My App", menu)
 

다음은 시스템 트레이에서 아이콘을 활성화하기 위해 Icon 개체의 run() 메서드를 호출합니다.

 
    icon.run()
 

icon.run() 라인은 PyStray 이벤트 루프를 시작하여, 시스템 트레이에서 아이콘을 활성화합니다. 이제 메뉴 항목 클릭과 같은 사용자 상호 작용에 응답하게 됩니다.

넷째, 시스템 트레이에서 Quit 메뉴 항목과 관련된 quit_window()를 정의합니다. 시스템 트레이 아이콘 메뉴에서 Quit 옵션을 선택하면, PyStray 이벤트 루프(icon.stop())가 중지되고 기본 창이 파괴되어 응용 프로그램(self.destory())이 완전히 종료됩니다.

 
    def quit_window(self, icon):
        icon.stop()
        self.destroy()
 

다섯째, 시스템 트레이 아이콘의 Show 메뉴 항목과 관련된 show_window() 메서드를 정의합니다.

 
    def show_window(self, icon):
        icon.stop()
        self.after(0,self.deiconify)
 

시스템 트레이 아이콘 메뉴에서 표시 옵션을 선택하면 시스템 트레이 아이콘이 닫히고( PyStray이벤트 루프 중지) after() 메서드를 사용하여 deiconify() 메서드가 즉시 호출되도록 예약하므로 기본 응용 프로그램이 복원되고 다시 표시됩니다.

 

요약

 
- PyStray 라이브러리를 사용하여 Tkinter 시스템 트레이 응용 프로그램을 만듭니다.
 

'GUI > tkinter' 카테고리의 다른 글

Tkinter Matplotlib  (0) 2024.04.05
Tkinter Validation  (0) 2024.04.04
Tkinter MVC  (0) 2024.04.03
How to Display a Progress Bar while a Thread is Running in Tkinter  (0) 2024.04.02
How to Schedule an Action with Tkinter after() method  (0) 2024.04.02