Приложение Tkinter System Tray в Python — пример создания

Приложение system tray — это тип приложения, которое работает в фоновом режиме и обеспечивает быстрый доступ к некоторым функциям. Обычно отображается в виде небольшого значка в системном трее или в области уведомлений на панели задач в среде рабочего стола Windows, macOS или Linux.

Распространенными примерами приложений system tray являются антивирусное программное обеспечение, клиенты мгновенного обмена сообщениями или программное обеспечение для мониторинга системы.

Пользователи могут взаимодействовать с приложением в области уведомлений, нажимая на него, чтобы открыть меню и выполнить определенные действия.

В Tkinter отсутствует встроенная поддержка приложения system tray, но для его создания можно использовать стороннюю библиотеку PyStray.

Содержание

Пример создания приложения system tray в Tkinter

Создание приложения system tray с использованием пакета Tkinter и PyStray включает следующие шаги:

Шаг 1. Установите библиотеки Pystray и Pillow

Установите библиотеки Pystray и Pillow с помощью команды pip. Pystray позволяет создать приложение в трее, а Pillow помогает разработать значок, помещаемый в системный трей.

pip install pystray pillow

Шаг 2. Создание приложения system tray Tkinter

Создайте скрипт Python и используйте следующий код:

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()

Выход:

Значок Tkinter в системном трее

App.ico можно скачать здесь:

App.ico

Как это работает.

  • Сначала импортируем необходимые библиотеки:
import tkinter as tk
import pystray
from PIL import Image
  • Во-вторых, определите новый класс MyApp, который расширяет класс tk.Tk. В конструкторе __init__() свяжите событие close с методом minimum_to_tray():
self.protocol('WM_DELETE_WINDOW', self.minimize_to_tray)

При нажатии кнопки «Закрыть» будет выполнен метод minimum_to_tray(), создающий значок в системном трее.

  • В-третьих, определите метод minimum_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()

Следующий код вызывает метод open() класса Image для загрузки app.ico, который будет использоваться в качестве значка для панели задач:

    # 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)

Следующий код вызывает метод run() объекта Icon, чтобы сделать значок активным в системном трее:

    icon.run()

Строка icon.run() запускает цикл событий PyStray, делая значок активным в системном трее. Теперь он будет реагировать на взаимодействие пользователя, например, на щелчки по элементам меню.

  • В-четвертых, определите quit_window(), связанный с пунктом меню Quit в системном трее. Когда вы выбираете опцию Quit из меню значка системного трея, он останавливает цикл событий PyStray(icon.stop()) и уничтожает главное окно, обеспечивая чистый выход из приложения(self.destroy())
    def quit_window(self, icon):
        icon.stop()
        self.destroy()

В-пятых, определите метод show_window(), связанный с пунктом меню «Show» на значке панели задач:

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

При выборе параметра «Show» в меню значка на панели задач значок на панели задач закрывается (останавливается цикл событий PyStray) и используется метод after() для планирования немедленного вызова метода deiconify(), в результате чего основное приложение восстанавливается и снова становится видимым.

Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *