Application dans le systray pour Windows et Linux.
Bonjour,
Je suis en plein développement d'un petit agent qui tournerai dans le systray, pour Windows et Linux.
J’étais tombé sur l’exemple de tyrtamos, dont je me suis inspiré.
Tout fonctionne comme prévu, sur Windows 7, Windows 10. Sur Linux, toutes les fonctionnalités sont aussi présentes et j'ai juste un petit souci d'affichage de l'icone de l'application sur un poste Debian 8.4 64bits.
Je suis en Python 3.4 64bits + PyQt5.5.1_64
Avant de poster sur le forum, j'ai fait des recherches, mais n'ai trouvé que peu d'informations pour Linux.
J'ai essayé avec différentes icônes (png, svg, xpm) en différentes tailles, mais rien n'y fait...
Je sais que l'icône est bien trouvée, car pour en être sûr je la met aussi sur une entrée du menu et là elle s'affiche bien.
Voici le code de ma classe "SystemTrayIcon":
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
|
from PyQt5 import (QtWidgets, QtGui)
import Model
class SystemTrayIcon(QtWidgets.QSystemTrayIcon):
""" Permet de mettre l'application dans la barre des taches """
_model = Model.Model()
def __init__(self, app, qicone, tooltip="", parent=None):
super(SystemTrayIcon, self).__init__(qicone, app)
self.app = app
self.parent = parent
# ajoute une bulle d'information quand la souris est sur l'icône tray
if tooltip != "":
self.setToolTip(self._model.app_tooltip)
# initialise le menu
self.initmenu()
#
def initmenu(self):
# crée le menu
menu = QtWidgets.QMenu(self.parent)
ouvrirPopupIcon = QtGui.QIcon(self._model.app_icone) # CELLE-CI S'AFFICHE !!
ouvrirPopupAction = QtWidgets.QAction(ouvrirPopupIcon, '&Ouvrir Alerte', self)
ouvrirPopupAction.triggered.connect(self.alerte)
menu.addAction(ouvrirPopupAction)
menu.addSeparator()
# ferme la fenêtre et quitte le programme:
# l'icône de l'item "Quitter" du menu sera une simple croix rouge
quitterIcon = QtGui.QIcon.fromTheme("application-exit", QtGui.QIcon(self._model.quitter_icone))
quitterAction = QtWidgets.QAction(quitterIcon, '&Quitter', self)
quitterAction.triggered.connect(self.quitter)
menu.addAction(quitterAction)
self.setContextMenu(menu)
def alerte(self):
""" Ouvre une fenetre de type Alerte"""
pass
def quitter(self):
"""permet de quitter: ferme le programme ainsi que le systemtray"""
reponse = QtWidgets.QMessageBox.question(None,
"Confirmez!",
"Voulez-vous vraiment quitter?",
QtWidgets.QMessageBox.Yes,
QtWidgets.QMessageBox.No)
if reponse == QtWidgets.QMessageBox.Yes:
# ferme la fenêtre si elle est encore ouverte
try:
self.fen.close()
except Exception:
pass
# ferme l'application et arrête l'exécution
self.app.quit() |
... appelée de puis le programme principal comme ceci:
Code:
1 2 3 4 5
| ...
# Landement de l'application dans la barre des taches
trayIcon = SystemTrayIcon(app, QtGui.QIcon(model.app_icone), model.app_tooltip) # ALORS QUE CELLE-LA NE S'AFFICHE PAS, UNIQUEMENT SUR LINUX !!
trayIcon.show()
... |
Voila, si quelqu'un à une idée, je suis preneur, d'autant plus que si ça ne fonctionne pas mieux je vais devoir laisser tomber PyQt5 au profit de PyGObject, que je trouve un peu moins sexy.