PySide6
1"""
2Пример создания иконки для лотка (трея) панели задач с привязкой к ней меню действий.
3В данном примере представлено приложение без главного окна (вообще без окон).
4"""
5import sys6from PySide6.QtWidgets import (QApplication,7QColorDialog,8QMenu,9QSystemTrayIcon
10)11from PySide6.QtGui import QAction, QIcon12
13"""
14Модуль os нужен для создания путей к файлам для разных платформ.
15Модуль sys нужен для доступа к аргументам командной строки. Если использование аргументов
16командной строки не предполагается, то импорт можно не выполнять. При этом, при создании
17приложения в класс QApplication([]) в качестве аргумента передается пустой список.
18Импорт из модуля QtCore класса QSize для управления размерами объектов и класса
19Qt - содержит различные идентификаторы, используемые в библиотеке Qt
20Импорт из модуля QtWidgets PySide6 класса для управления приложением QApplication, класса виджета
21диалогового окна выбора цвета, класса виджета панели инструментов меню, класса виджета иконки
22для лотка (трея) панели задач QSystemTrayIcon.
23Импорт из модуля QtGui класса эффектов действия QAction, класса для создания иконок QIcon.
24Другие виджеты можно найти по ссылке https://doc.qt.io/qt-5/widget-classes.html#basic-widget-classes
25"""
26
27
28def copy_color_hex() -> None:29"""30Функция, запускающая диалоговое окно выбора цвета
31:return: None
32"""
33if dialog.exec(): # данная конструкция запускает диалог выбора цвета и в случае успеха производит действия34color = dialog.currentColor() # записывает в переменную параметры выбранного цвета35clipboard.setText(color.name()) # передает в буфер обмена параметры выбранного цвета36
37
38def copy_color_rgb() -> None:39"""40Функция, запускающая диалоговое окно выбора цвета
41:return: None
42"""
43if dialog.exec(): # данная конструкция запускает диалог выбора цвета и в случае успеха производит действия44color = dialog.currentColor() # записывает в переменную параметры выбранного цвета45clipboard.setText(f'rgb({color.red()}, {color.green()}, {color.blue()})')46# передает в буфер обмена параметры выбранного цвета47
48
49def copy_color_hsv() -> None:50"""51Функция, запускающая диалоговое окно выбора цвета
52:return: None
53"""
54if dialog.exec(): # данная конструкция запускает диалог выбора цвета и в случае успеха производит действия55color = dialog.currentColor() # записывает в переменную параметры выбранного цвета56clipboard.setText(f'hsv({color.hue()}, {color.saturation()}, {color.value()})')57# передает в буфер обмена параметры выбранного цвета58
59
60app = QApplication(sys.argv) # Создание экземпляра класса основного цикла событий приложения.61app.setStyle('Fusion') # более интересная глобальная кроссплатформенна тема Fusion62app.setQuitOnLastWindowClosed(False) # отключает закрытие приложения при закрытии всех его окон63# т.е. при закрытии всех окон приложения оно остается запущенным
64clipboard = QApplication.clipboard() # создание буфера обмена65dialog = QColorDialog() # создание экземпляра класса диалогового окна выбора цвета66icon = QIcon('icon.png') # создание иконки из графического файла67tray = QSystemTrayIcon() # создание экземпляра класса виджета иконки для лотка (трея) панели задач68tray.setIcon(icon) # привязка иконки к виджету иконки для панели задач69tray.setVisible(True) # разрешение видимости иконки для панели задач70menu = QMenu() # создание экземпляра класса виджета меню71action1 = QAction('Hex') # создание экземпляра класса эффекта действия с указанием его наименования72action1.triggered.connect(copy_color_hex) # создание сигнала с привязкой ресивера для пункта меню73menu.addAction(action1) # размещение эффекта действия в меню74action2 = QAction('RGB') # создание экземпляра класса эффекта действия с указанием его наименования75action2.triggered.connect(copy_color_rgb) # создание сигнала с привязкой ресивера для пункта меню76menu.addAction(action2) # размещение эффекта действия в меню77action3 = QAction('HSV') # создание экземпляра класса эффекта действия с указанием его наименования78action3.triggered.connect(copy_color_hsv) # создание сигнала с привязкой ресивера для пункта меню79menu.addAction(action3) # размещение эффекта действия в меню80quit_app = QAction('Quit') # создание экземпляра класса эффекта действия с указанием его наименования81quit_app.triggered.connect(app.quit) # создание сигнала с командой на выход из приложения82menu.addAction(quit_app) # размещение эффекта действия в меню83tray.setContextMenu(menu) # установка созданного меню как контекстного меню84app.exec() # Запуск основного цикла событий главного окна приложения.85