IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PyQt Python Discussion :

Application dans le systray pour Windows et Linux.


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2016
    Messages : 13
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Citation Envoyé par Pingoo0 Voir le message
    J’étais tombé sur l’exemple de tyrtamos, dont je me suis inspiré.
    Très bonne source!

    Citation Envoyé par Pingoo0 Voir le message
    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.
    A quel endroit l’icône n'apparait-elle pas alors qu'elle le devrait?

    Je viens d'essayer sur le dernier linux mint 18 (enfant d'ubuntu donc de debian) avec Python v3.5.1 et PyQt5 v5.5.1 le tout en 32bits . Avec un copier-coller des codes de mon site, il y a bien une icône dans la zone de notification (icone.png), et un clic sur cette icône fait bien apparaître la fenêtre voulue. Par contre, il n'y a pas d'icône en haut de cette fenêtre comme sous Windows, mais aucune application n'en a sur ce Linux (bureau cinnamon).

    Précise!

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2016
    Messages : 13
    Par défaut
    Merci de cette réponse rapide, et au passage, félicitations pour le livre de recettes Python, j'y ai vu des articles très intéressants.

    Citation Envoyé par tyrtamos Voir le message
    A quel endroit l’icône n'apparait-elle pas alors qu'elle le devrait?
    C'est uniquement l’icône du systray qui ne s'affiche pas ?!?
    Et sur 2 machines très différentes, mon portable de bureau et une installation toute propre sur mon ordi perso, c'est le même souci.
    Quand je fais apparaître la zone de notification du bas de l'écran, je vois ceci dans le coin en bas à droite: Nom : Capture d'écran de 2016-07-13 21:16:27.png
Affichages : 661
Taille : 21,9 Ko

    Et pourtant, si je promène ma souris dans le coin, il y a bien une application qui est cachée... Nom : Capture d'écran de 2016-07-13 21:16:45.png
Affichages : 612
Taille : 25,4 Ko

    Citation Envoyé par tyrtamos Voir le message
    Je viens d'essayer sur le dernier linux mint 18 (enfant d'ubuntu donc de debian) avec Python v3.5.1 et PyQt5 v5.5.1 le tout en 32bits . Avec un copier-coller des codes de mon site, il y a bien une icône dans la zone de notification (icone.png), et un clic sur cette icône fait bien apparaître la fenêtre voulue. Par contre, il n'y a pas d'icône en haut de cette fenêtre comme sous Windows, mais aucune application n'en a sur ce Linux (bureau cinnamon).
    Il me semble bien que c’était mon premier test, mais pour être sûr, je viens de le refaire, et j'ai le même résultat, une application invisible si on ne passe pas le pointeur dessus.

  4. #4
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Une idée: regarde la dimension de l'icône.

    Extrait de la doc de Qt5:

    On Windows, the system tray icon size is 16x16; on X11, the preferred size is 22x22. The icon will be scaled to the appropriate size as necessary.

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2016
    Messages : 13
    Par défaut
    Oui, j'avais déjà vu ce passage de la doc, et même si il est écrit que le redimensionnement est pris en charge, j'ai essayé avec toutes les tailles de 16 à 512px...
    Et devinez quoi ? Ça n'a rien changé.

  6. #6
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Si ça marche chez moi et pas chez toi cela provient probablement d'une différence entre les bureaux graphiques utilisés.

    Autre idée: ajouter .setVisible(True). En principe, .show() devrait suffire, mais ça ne coûte pas grand chose d'essayer. Ce qui donnerait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        # lancement du tray
        trayIcon = SystemTrayIcon(qicone, bulle) # bulle est une variable globale
        trayIcon.setVisible(True)
        trayIcon.show()

Discussions similaires

  1. Insertion d'une Application dans le Systray
    Par mkiba dans le forum Langage
    Réponses: 1
    Dernier message: 07/11/2007, 14h05
  2. Compiler pour Windows sous Linux
    Par YuGiOhJCJ dans le forum Choisir un environnement de développement
    Réponses: 11
    Dernier message: 05/09/2007, 19h40
  3. Quel langage d'avenir simple choisir pour du calcul, pour Windows et Linux ?
    Par c-paspire dans le forum Langages de programmation
    Réponses: 26
    Dernier message: 09/03/2007, 11h46
  4. [perl packager] package pour windows depuis linux
    Par doudweb dans le forum Modules
    Réponses: 1
    Dernier message: 10/09/2006, 22h54
  5. Quel langage pour un logiciel avec BD pour Windows et Linux
    Par Guilhem_mdg dans le forum Windows
    Réponses: 3
    Dernier message: 19/03/2006, 16h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo