Forum Programmation.python Un bel OSD en python ?

Posté par  .
Étiquettes : aucune
0
15
juin
2006
Bonjour à tous et à toutes,

Je voudrais créer un petit OSD qui m'afficherait le nombre de messages dans ma boite mail. Le script qui se connecte à ma boite mail est écrit en python et retourne une valeur qui est affichée dans un thème SuperKaramba.

Je voudrais qu'en plus de retourner une valeur à SuperKaramba, le script affiche un OSD quand j'ai reçu un mail. Je connais pyosd (wrapper de XOSD) mais force est d'avouer que les OSD qu'il crée sont particulièrement moches. J'aimerais avoir la possibilité de créer un OSD sous forme d'un petit rectangle (si possible avec de la transparence), une image (une petite lettre) et enfin du texte (le nombre de mails reçus), un peut dans le même genre que l'OSD de K3b ou Amarok.

Je m'en remets à vous parce que Google ne veut plus m'aider (toutes mes requêtes renvoient vers pyosd). Je pense que c'est possible de faire ce genre de chose avec pyqt ou pykde mais je n'arrive pas à m'en sortir avec la doc. Une âme généreuse pour me refiler des bouts de code ? une explication ? un lien ? Je suis aussi prenneur de toute autre piste.

Merci de m'avoir lu jusqu'au bout ! (Si quelque chose n'est pas très clair, signalez-le moi ;-)
  • # petit bout de code

    Posté par  (site web personnel) . Évalué à 3.

    salut,
    un truc que j'ai vite fait et mal fait, si ça peut aider: http://home.tele2.fr/solsTiCe/osd.py

    utilise pyqt et python
    • [^] # Re: petit bout de code

      Posté par  . Évalué à 1.

      Oui, c'est sur que ça peut aider......
      C'est exactement ce que je voulais, un grand merci...
      J'ai plus qu'à changer la police et la couleur !

      Donc, encore merci....ça fait trois jour que je cherchais !
      Comme quoi, il va vraiment falloir que je me plonge dans la doc de pyqt !
      • [^] # Re: petit bout de code

        Posté par  (site web personnel) . Évalué à 3.

        pyqt n'a pas vraiment de doc
        c'est plutôt la doc de Qt qu'il faut regarder, ou se plonger dedans et s'y perdre ! ;-)
        • [^] # Re: petit bout de code

          Posté par  . Évalué à 1.

          Oui, c'est sont principal défaut.

          Je suis dans la doc de qt mais c'est prévu pour du C++. Et comme je n'ai que des connaissances basiques de Python, j'ai beaucoup un peu de mal, c'est pour ça que j'avais demandé une base de travail. Je n'ai vrament aucun mal a me perdre dans la doc ;-)

          J'ai quand même (en 2h) réussi a faire apparaitre l'OSD au dessus des autres fenêtres, a changer sa position et a supprimmer son entrée dans la barre des taches !

          flags = Qt.WStyle_Customize | Qt.WStyle_NoBorder | Qt.WStyle_StaysOnTop | Qt.WType_Popup

          J'ai aussi changé sa couleur : j'ai lutté avec le type Qcolor avant d'avoir la bonne idée d'utiliser Qtdesigner et pyuic pour voir le code qu'il produisaient !

          Je cherche maintenant à pouvoir avoir un rectangle arrondi, la tranparence (c'est possible avec pyqt3.3 ?), un effet de glissement depuis l'un des bords de l'écran à l'apparition, une ombre, ajouter une image...

          PS : Oui, je n'ai que ça à faire !
    • [^] # Re: petit bout de code

      Posté par  (site web personnel) . Évalué à 1.

      j'efface le script de mon site donc je le mets pour référence:

      # -*- coding: latin1 -*-
      import sys
      from qt import *

      class Osd(QWidget):
      def __init__(self,text,delay = 3000):
      self.text = text
      self.delay = delay
      parent = None
      name = 'Osd'
      flags = Qt.WStyle_Customize | Qt.WStyle_NoBorder
      QWidget.__init__(self,parent,name,flags)
      self.setFixedSize(10,10)
      self.main()

      def main(self):
      self.show()
      QTimer.singleShot(self.delay,self.close)

      def paintEvent(self,qpe):
      p = QPainter()
      p.begin(self)
      p.setFont(QFont('Helvetica',24,QFont.Normal))
      fm = p.fontMetrics()
      w = fm.width(self.text)
      h = fm.height()
      self.setFixedSize(w+50,h+10)
      p.drawText(25,25,QString(self.text))
      # p.drawRoundRect(self.rect(),10,10)
      p.end()

      if __name__ == '__main__':
      app = QApplication(sys.argv)
      osd = Osd('Salut Xion345 !')
      app.setMainWidget(osd)
      app.exec_loop()
      • [^] # Re: petit bout de code

        Posté par  . Évalué à 1.

        Pour ceux que ça intérresse : je mets une version bidouillée !
        Enfin, c'est du travail de sagouin mais ça marche quand même !

        Les différences par rapport à la version du dessus sont que l'osd s'affiche au dessus de toutes les autres fenêtres, n'apparait pas dans la barre des taches et est constitué d'une icone en plus !

        # -*- coding: utf-8 -*-
        import sys
        from qt import *

        class Osd(QWidget):
        def __init__(self,text,delay = 10000, posx = 100, posy = 100, icone ='kmaillight.png', color1 = QColor(0,0,0), color2 = QColor(240,240,240)):
        self.color1 = color1
        self.color2 = color2
        self.text = text
        self.icone = icone
        self.delay = delay

        self.posx = posx
        self.posy = posy
        parent = None
        name = 'Osd'
        flags = Qt.WStyle_Customize | Qt.WStyle_NoBorder | Qt.WStyle_StaysOnTop | Qt.WType_Popup
        QWidget.__init__(self,parent,name,flags)
        self.setWindowOpacity(0.0) # Ne fonctionne pas ! Une autre idée pour gérer la transparence ?
        self.setPaletteBackgroundColor(self.color2)
        self.move(self.posx, self.posy)
        self.setFixedSize(1,1)
        self.main()

        def main(self):

        self.show()
        QTimer.singleShot(self.delay,self.close)

        def paintEvent(self,qpe):
        p = QPainter()
        p.begin(self)
        p.setPen(QPen(self.color1,3))
        p.setFont(QFont('Helvetica',10,QFont.Normal))
        fm = p.fontMetrics()
        w = fm.width(self.text)
        h = fm.height()
        self.setFixedSize(w+50+32,42)

        imagefile = open(self.icone, 'r')
        imagedata = imagefile.read()
        image = QPixmap()

        image.loadFromData(imagedata, "PNG")

        p.drawPixmap(5,5,image)
        p.drawText(25+32,25,QString(self.text))
        p.drawRect(self.rect())

        p.end()


        if __name__ == '__main__':
        app = QApplication(sys.argv)
        osd = Osd('This is an osd')
        app.setMainWidget(osd)

        app.exec_loop()

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.