2
Пример создания иконки для лотка (трея) панели задач с привязкой к ней меню действий.
3
В данном примере представлен вариант полного приложения.
6
from PySide6.QtWidgets import (QApplication,
12
from PySide6.QtGui import QAction, QIcon
15
Модуль os нужен для создания путей к файлам для разных платформ.
16
Модуль sys нужен для доступа к аргументам командной строки. Если использование аргументов
17
командной строки не предполагается, то импорт можно не выполнять. При этом, при создании
18
приложения в класс QApplication([]) в качестве аргумента передается пустой список.
19
Импорт из модуля QtCore класса QSize для управления размерами объектов и класса
20
Qt - содержит различные идентификаторы, используемые в библиотеке Qt
21
Импорт из модуля QtWidgets PySide6 класса для управления приложением QApplication и
22
класса основного окна QMainWindow, класса виджета панели инструментов меню, класса виджета
23
иконки для лотка (трея) панели задач QSystemTrayIcon, класса виджета многострочного текстового
25
Импорт из модуля QtGui класса эффектов действия QAction, класса для создания иконок QIcon.
26
Другие виджеты можно найти по ссылке https://doc.qt.io/qt-5/widget-classes.html#basic-widget-classes
30
class MainWindow(QMainWindow):
32
Подкласс главного окна приложения с наследованием от супер класса главных окон
35
def __init__(self, app: QApplication) -> None:
37
Конструктор главного окна приложения
38
:param app: ссылка на экземпляр основного цикла главного окна приложения
40
QMainWindow.__init__(self) # явный вызов конструктора родительского класса
41
app.setQuitOnLastWindowClosed(False) # Устанавливает возможность продолжения работы приложения
42
# при закрытии его окон
43
icon = QIcon('animal-penguin.png') # создание иконки из графического файла
44
self.tray = QSystemTrayIcon() # создание экземпляра класса виджета иконки для лотка (трея) панели задач
45
self.tray.setIcon(icon) # привязка иконки к виджету иконки лотка панели задач
46
self.tray.setVisible(True) # разрешение видимости иконки для панели задач
47
self.tray.activated.connect(self.activate)
48
app.aboutToQuit.connect(self.save)
49
self.editor = QTextEdit() # создание экземпляра класса многострочного текстового поля
50
self.load() # вызов метода загрузки текста из файла
51
menu = self.menuBar() # создание панели меню в главном окне приложения
52
file_menu = menu.addMenu('&File') # добавление на панель меню Файл
53
self.reset = QAction('&Reset') # создание экземпляра класса эффекта действия с указанием его наименования
54
self.reset.triggered.connect(self.editor.clear) # создание сигнала для эффекта действия, выполняющего команду
55
# очистки текстового поля
56
file_menu.addAction(self.reset) # добавление в меню Файл действия на очистку текстового поля
57
self.quit = QAction('&Quit') # создание экземпляра класса эффекта действия с указанием его наименования
58
self.quit.triggered.connect(app.quit) # создание сигнала для эффекта действия, выполняющего команду выхода
59
file_menu.addAction(self.quit)
60
self.setCentralWidget(self.editor)
61
self.setWindowTitle('PenguinNotes')
63
def load(self) -> None:
65
Метод ресивер (слот), который загружает текст из файла в текстовое поле
68
with open('notes.txt', 'r') as f: # Открытие файла на чтение с помощью менеджера контекста
69
# если файл не существует, будет выброшено исключение
70
text = f.read() # чтение текст из файла в переменную
71
self.editor.setPlainText(text) # передача текста из переменной в текстовое поле
73
def save(self) -> None:
75
Метод ресивер (слот), который сохраняет текст в файл из текстового поля
78
text = self.editor.toPlainText() # чтение текста из текстового поля в переменную
79
with open('notes.txt', 'w') as f: # открытие файла на запись с помощью менеджера контекста
80
f.write(text) # запись файла из переменной в файл
82
def activate(self, reason: QSystemTrayIcon) -> None:
84
Метод ресивер (слот), при активации выводящий окно приложения
85
:param reason: QSystemTrayIcon - событие активации (клика на иконке приложения в лотке панели задач)
88
if reason == QSystemTrayIcon.Trigger: # проверка условия активации
89
if self.isVisible(): # проверка условия видимости окна приложения
90
self.hide() # спрятать окно приложения
92
self.show() # показать окно приложения
97
Функция запуска кода верхнего уроня приложения
100
app = QApplication(sys.argv) # создание экземпляра основного цикла главного окна приложения
101
app.setStyle('Fusion') # более интересная глобальная кроссплатформенна тема Fusion
102
window = MainWindow(app) # создание экземпляра главного окна приложения
103
app.exec() # запуска основного цикла главного окна приложения
106
if __name__ == '__main__': # данное условие нужно для предотвращения запуска кода верхнего уровня при
107
# импортировании данного файла как модуля
108
main() # вызов функции запуска кода верхнего уровня приложения