QSystemTrayIcon 改变图标
QSystemTrayIcon change Icon
我正在尝试更改/更新 QSystemtrayIcon 的图标,但它不起作用。
main.py:
if __name__=="__main__":
app = QApplication(sys.argv)
from systray import SystemTrayIcon
trayIcon = SystemTrayIcon(parent=app)
trayIcon.show()
sys.exit(app.exec_())
systray.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 时它被打印,但它不会改变图标。
有什么建议吗?
我在您的代码中看到的问题是,在 mainwindow.py 中,您正在创建另一个 SystemTrayIcon,它是一个局部变量,正如您所说,它正确地调用了函数 set_icon,但由于它是一个局部变量它在完成时被消除运行set_icon,这样就看不到了。
一个可能的解决方案是将它传递给构造函数中的系统托盘,并使其成为 class:
的成员
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_())
我正在尝试更改/更新 QSystemtrayIcon 的图标,但它不起作用。
main.py:
if __name__=="__main__":
app = QApplication(sys.argv)
from systray import SystemTrayIcon
trayIcon = SystemTrayIcon(parent=app)
trayIcon.show()
sys.exit(app.exec_())
systray.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 时它被打印,但它不会改变图标。
有什么建议吗?
我在您的代码中看到的问题是,在 mainwindow.py 中,您正在创建另一个 SystemTrayIcon,它是一个局部变量,正如您所说,它正确地调用了函数 set_icon,但由于它是一个局部变量它在完成时被消除运行set_icon,这样就看不到了。
一个可能的解决方案是将它传递给构造函数中的系统托盘,并使其成为 class:
的成员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_())