Политика конфиденциальностиКонтактыО сайтеОтзывыGitHubDonate
© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB

PyQt5 - Урок 003. QSystemTrayIcon - Как свернуть приложение в трей

PyQt5, Pycharm, Qt, QSystemTrayIcon

Аналогичная статья на Qt/C++

Одной из первых статей по работе с Qt была статья по работе с QSystemTrayIcon . А теперь настал черёд аналогичного материала, но уже на Python с применением библиотеки PyQt5.

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

Структура проекта в данном случае минимальна. Будет всего лишь один файл, который и будет запускаться. То есть файл __main__.py .

Само приложение будет выглядеть следующим образом.

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

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

__main__.py

from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QGridLayout, QWidget, QCheckBox, QSystemTrayIcon, \
    QSpacerItem, QSizePolicy, QMenu, QAction, QStyle, qApp
from PyQt5.QtCore import QSize


class MainWindow(QMainWindow):
    """
        Объявление чекбокса и иконки системного трея.
        Инициализироваться будут в конструкторе.
    """
    check_box = None
    tray_icon = None

    # Переопределяем конструктор класса
    def __init__(self):
        # Обязательно нужно вызвать метод супер класса
        QMainWindow.__init__(self)

        self.setMinimumSize(QSize(480, 80))             # Устанавливаем размеры
        self.setWindowTitle("System Tray Application")  # Устанавливаем заголовок окна
        central_widget = QWidget(self)                  # Создаём центральный виджет
        self.setCentralWidget(central_widget)           # Устанавливаем центральный виджет

        grid_layout = QGridLayout(self)         # Создаём QGridLayout
        central_widget.setLayout(grid_layout)   # Устанавливаем данное размещение в центральный виджет
        grid_layout.addWidget(QLabel("Application, which can minimize to Tray", self), 0, 0)

        # Добавляем чекбокс, от которого будет зависеть поведение программы при закрытии окна
        self.check_box = QCheckBox('Minimize to Tray')
        grid_layout.addWidget(self.check_box, 1, 0)
        grid_layout.addItem(QSpacerItem(0, 0, QSizePolicy.Expanding, QSizePolicy.Expanding), 2, 0)

        # Инициализируем QSystemTrayIcon
        self.tray_icon = QSystemTrayIcon(self)
        self.tray_icon.setIcon(self.style().standardIcon(QStyle.SP_ComputerIcon))

        '''
            Объявим и добавим действия для работы с иконкой системного трея
            show - показать окно
            hide - скрыть окно
            exit - выход из программы
        '''
        show_action = QAction("Show", self)
        quit_action = QAction("Exit", self)
        hide_action = QAction("Hide", self)
        show_action.triggered.connect(self.show)
        hide_action.triggered.connect(self.hide)
        quit_action.triggered.connect(qApp.quit)
        tray_menu = QMenu()
        tray_menu.addAction(show_action)
        tray_menu.addAction(hide_action)
        tray_menu.addAction(quit_action)
        self.tray_icon.setContextMenu(tray_menu)
        self.tray_icon.show()

    # Переопределение метода closeEvent, для перехвата события закрытия окна
    # Окно будет закрываться только в том случае, если нет галочки в чекбоксе
    def closeEvent(self, event):
        if self.check_box.isChecked():
            event.ignore()
            self.hide()
            self.tray_icon.showMessage(
                "Tray Program",
                "Application was minimized to Tray",
                QSystemTrayIcon.Information,
                2000
            )


if __name__ == "__main__":
    import sys

    app = QApplication(sys.argv)
    mw = MainWindow()
    mw.show()
    sys.exit(app.exec())

Видеоурок

Комментарии

5 октября 2017 г. 1:20

Congratulations on the article, it was a great help.

5 октября 2017 г. 7:01

No problem. If you need help with another questions with PyQt5. Then you can ask me on the forum in this site .

PyQt5 is not my main field, therefore I have a little number of articles, but it is not problem for me to answer about PyQt5 on the forum.

Для Django рекомендую VDS-хостинг TIMEWEB

24 июня 2018 г. 13:51

В консоль выдается предупреждение. Почему и как исправить? Может ошибка в коде или QGridLayout как-нибудь не так добавляется?

QLayout: Attempting to add QLayout "" to MainWindow "", which already has a layout
25 июня 2018 г. 7:51

Если не ошибаюсь, можно просто удалить вот эту строку

central_widget.setLayout(grid_layout)
Там указатель на парента передаётся в само размещение, что автоматически заменяет в размещение в central_widget и всё нормально работает.

Для Django рекомендую VDS-хостинг TIMEWEB

16 августа 2018 г. 17:20

Добрый вечер Евгений и форумчане! Не подскажите почему в при запуске данного кода в PyCharm выдаётся сообщение: "ModuleNotFoundError: No module named 'PyQt5'"?

17 августа 2018 г. 3:00

PyQt5 установлен

17 августа 2018 г. 15:47

Решение проблемы нашел в интернете)) Лечится так: File - Settings - Project:{name_my_project} - Project Interpreter - устанавливаем нужную нам версию интерпретатора(python 3.6.2 например) - Install(плюсик сбоку) - Available Packages - набираем в поиске PyQt5 - нажимаем Install Package

23 августа 2018 г. 8:11

Хорошо, что нашли решение. Получается что через виртуальную среду проекта настроили, если правильно понимаю

Для Django рекомендую VDS-хостинг TIMEWEB

23 августа 2018 г. 14:59
На этот вопрос Вам ответить затрудняюсь, так как не силён такими познаниями в программировании. А что за виртуальная среда?
24 августа 2018 г. 7:13

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

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

Для Django рекомендую VDS-хостинг TIMEWEB

24 августа 2018 г. 15:12

Спасибо за подсказку, запомню на будущее.

Комментарии

Только авторизованные пользователи могут оставлять комментарии.
Пожалуйста, Авторизуйтесь или Зарегистрируйтесь
9 декабря 2018 г. 22:00
Yura Gajdar

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:70баллов,
  • Очки рейтинга1
9 декабря 2018 г. 2:33
anat_home@ukr.net

C++ - Тест 001. Первая программа и типы данных

  • Результат:100баллов,
  • Очки рейтинга10
9 декабря 2018 г. 2:29
anat_home@ukr.net

C++ - Тест 001. Первая программа и типы данных

  • Результат:60баллов,
  • Очки рейтинга-1
Последние комментарии
9 декабря 2018 г. 8:14
Евгений Легоцкой

Вы можете в QSettings записать откуда угодно bool переменную без всяких чекбоксов. def save_check_box_settings(self): settings = QSettings() settings.setValue(SETTINGS_TRAY,...
8 декабря 2018 г. 13:02
Жасулан Нургожинов

а как можно это сделать без чек бокса
5 декабря 2018 г. 13:25
Евгений Легоцкой

Значит всё-таки в переменных окружения была проблема. Полагаю, что Qt Creator берёт информацию сначала из переменных PATH, либо записывает её из  своего конфига, а потом берёт уже из PATH при ...
5 декабря 2018 г. 13:21
IscanderChe

В переменной PATH путь к CMake был указан как G:\soft\CMake\bin, в реальности же каталог называется Cmake. Причём после изменения в переменной PATH всё заработало, а в Qt Creator путь ос...
5 декабря 2018 г. 10:53
Евгений Легоцкой

Под linux как правило проще, там всё по свои каталогам и полочкам разложено сразу. Думается мне, что проблема все-таки где-то в путях переменных...
Сейчас обсуждают на форуме
9 декабря 2018 г. 18:55
Игорь Максимов

Доброго времени суток. Нашел приложение для конвертации видео + celery что очень радует. Не радует только то что оно отказывается работать под python3 Трейсбек прикладываю: File "/ho...
9 декабря 2018 г. 15:14
Евгений Легоцкой

Непонятно, вы драйвер скачали или собирали? Сдаётся мне, что возможно более правильный вариант собрать своим компилятором вначале его, а потом уже подключать.
8 декабря 2018 г. 18:30
Жасулан Нургожинов

может так будет понятнее# -*- coding: utf-8 -*-# Form implementation generated from reading ui file 'C:\Users\hallgato\PycharmProjects\workers.ui'## Created by: PyQt5 UI code generator 5.11...
8 декабря 2018 г. 10:51
Даниил Тетерин

Но если серьезно, то действительно помощь нужна. Мне по-хорошему нужно сдать это в понедельник
Присоединяйтесь к нам в социальных сетях

Для зарегистрированных пользователей на сайте присутствует минимальное количество рекламы