QSystemTrayIcon изменить значок

Я пытаюсь изменить/обновить значок QSystemtrayIcon, но это не сработает.

main.py:

if __name__=="__main__":

app = QApplication(sys.argv)

from systray import SystemTrayIcon
trayIcon = SystemTrayIcon(parent=app)
trayIcon.show()

sys.exit(app.exec_())

системный трей.py:

class SystemTrayIcon(QSystemTrayIcon):

def __init__(self, parent=None):
    QSystemTrayIcon.__init__(self, parent)
    icon = QIcon(abspath("images/icon.png"))
    self.setIcon(icon)
    #menu stuff and so on

def set_icon(self):
    self.setIcon(QIcon(abspath("images/envelope.png")))

Внутри моего mainwindow.py я хочу изменить значок, когда происходит событие. Как мне вызвать метод set_icon или изменить значок прямо из mainwindow.py?

Большое спасибо

Редактировать:

Я пробовал в mainwindow.py:

import systray

class MainWindow(QWidget):
    #class stuff

    def change_icon(self):
        trayIcon = systray.SystemTrayIcon()
        trayIcon.set_icon()

Функция вызывается, когда я помещаю печать внутрь set_icon в системном трее, она печатается, но не меняет значок.

Какие-либо предложения?


person dhirczy87    schedule 21.06.2018    source источник


Ответы (1)


Проблема, как я вижу в вашем коде, заключается в том, что в mainwindow.py вы создаете еще один SystemTrayIcon, который является локальной переменной, которая, как вы говорите, правильно вызывает функцию set_icon, но, поскольку это локальная переменная, она устраняется после завершения работы set_icon , так что не будет видно.

Возможное решение — передать его в системный трей в конструкторе и сделать его членом класса:

mainwindow.py

from PyQt5.QtWidgets import QWidget, QVBoxLayout, QPushButton

class MainWindow(QWidget):
    def __init__(self, systray, parent=None):
        QWidget.__init__(self, parent)
        lay = QVBoxLayout(self)
        self.button = QPushButton("Change Icon")
        lay.addWidget(self.button)
        self.systray = systray

        self.button.clicked.connect(self.systray.set_icon)

systray.py

from os.path import abspath

from PyQt5.QtWidgets import QSystemTrayIcon
from PyQt5.QtGui import QIcon


class SystemTrayIcon(QSystemTrayIcon):
    def __init__(self, parent=None):
        QSystemTrayIcon.__init__(self, parent)
        icon = QIcon(abspath("images/icon.png"))
        self.setIcon(icon)

    def set_icon(self):
        self.setIcon(QIcon(abspath("images/envelope.png")))

main.py

import sys

from PyQt5.QtWidgets import QApplication

from mainwindow import MainWindow
from systray import SystemTrayIcon


if __name__=="__main__":

    app = QApplication(sys.argv)

    systray = SystemTrayIcon(app)
    systray.show()
    w = MainWindow(systray)
    w.show()
    sys.exit(app.exec_())
person eyllanesc    schedule 21.06.2018