PySide6

Форк
0
/
12_systray_window.py 
108 строк · 8.0 Кб
1
"""
2
Пример создания иконки для лотка (трея) панели задач с привязкой к ней меню действий.
3
В данном примере представлен вариант полного приложения.
4
"""
5
import sys
6
from PySide6.QtWidgets import (QApplication,
7
                               QMainWindow,
8
                               QMenu,
9
                               QSystemTrayIcon,
10
                               QTextEdit
11
                               )
12
from PySide6.QtGui import QAction, QIcon
13

14
"""
15
Модуль os нужен для создания путей к файлам для разных платформ.
16
Модуль sys нужен для доступа к аргументам командной строки. Если использование аргументов
17
командной строки не предполагается, то импорт можно не выполнять. При этом, при создании
18
приложения в класс QApplication([]) в качестве аргумента передается пустой список.
19
Импорт из модуля QtCore класса QSize для управления размерами объектов и класса
20
Qt - содержит различные идентификаторы, используемые в библиотеке Qt
21
Импорт из модуля QtWidgets PySide6 класса для управления приложением QApplication и
22
класса основного окна QMainWindow, класса виджета панели инструментов меню, класса виджета
23
иконки для лотка (трея) панели задач QSystemTrayIcon, класса виджета многострочного текстового
24
поля QTextEdit.
25
Импорт из модуля QtGui класса эффектов действия QAction, класса для создания иконок QIcon.
26
Другие виджеты можно найти по ссылке https://doc.qt.io/qt-5/widget-classes.html#basic-widget-classes
27
"""
28

29

30
class MainWindow(QMainWindow):
31
    """
32
    Подкласс главного окна приложения с наследованием от супер класса главных окон
33
    """
34

35
    def __init__(self, app: QApplication) -> None:
36
        """
37
        Конструктор главного окна приложения
38
        :param app:  ссылка на экземпляр основного цикла главного окна приложения
39
        """
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')
62

63
    def load(self) -> None:
64
        """
65
        Метод ресивер (слот), который загружает текст из файла в текстовое поле
66
        :return: None
67
        """
68
        with open('notes.txt', 'r') as f:  # Открытие файла на чтение с помощью менеджера контекста
69
            # если файл не существует, будет выброшено исключение
70
            text = f.read()  # чтение текст из файла в переменную
71
        self.editor.setPlainText(text)  # передача текста из переменной в текстовое поле
72

73
    def save(self) -> None:
74
        """
75
        Метод ресивер (слот), который сохраняет текст в файл из текстового поля
76
        :return: None
77
        """
78
        text = self.editor.toPlainText()  # чтение текста из текстового поля в переменную
79
        with open('notes.txt', 'w') as f:  # открытие файла на запись с помощью менеджера контекста
80
            f.write(text)  # запись файла из переменной в файл
81

82
    def activate(self, reason: QSystemTrayIcon) -> None:
83
        """
84
        Метод ресивер (слот), при активации выводящий окно приложения
85
        :param reason:  QSystemTrayIcon - событие активации (клика на иконке приложения в лотке панели задач)
86
        :return: None
87
        """
88
        if reason == QSystemTrayIcon.Trigger:  # проверка условия активации
89
            if self.isVisible():  # проверка условия видимости окна приложения
90
                self.hide()  # спрятать окно приложения
91
            else:
92
                self.show()  # показать окно приложения
93

94

95
def main() -> None:
96
    """
97
    Функция запуска кода верхнего уроня приложения
98
    :return: None
99
    """
100
    app = QApplication(sys.argv)  # создание экземпляра основного цикла главного окна приложения
101
    app.setStyle('Fusion')  # более интересная глобальная кроссплатформенна тема Fusion
102
    window = MainWindow(app)  # создание экземпляра главного окна приложения
103
    app.exec()  # запуска основного цикла главного окна приложения
104

105

106
if __name__ == '__main__':  # данное условие нужно для предотвращения запуска кода верхнего уровня при
107
    # импортировании данного файла как модуля
108
    main()  # вызов функции запуска кода верхнего уровня приложения
109

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.