PyQt4.4 et un Lecteur de musique

Publié le 22 juin 2008 par Mikebrant

C'est simple et rapide à faire .

Dans cet article, on va apprendre à lire/arrêter une musique, et contrôler le volume .

Bon je vais pas expliquer le design du lecteur vu que c'est pas le but du sujet, donc voici le code :

#-*- coding:Utf-8 -*-
from PyQt4.QtGui import *
from PyQt4.QtCore import *
from PyQt4.phonon import *
CHEMIN = '/home/MikeBrant/Bureau/QT4.4/'
class MaFenetre(QMainWindow):
   def __init__(self):
   QMainWindow.__init__(self)
   self.resize(300,100)
  
   self.onLit = False
   self.maListe = [CHEMIN + 'a.mp3',CHEMIN + 'b.mp3',CHEMIN + 'c.mp3']
   self.maChanson = 0
   self.joue = False
  
   ##### boutons ####
   self.pause = QPushButton()
   self.pause.setIcon( QIcon ( CHEMIN +'Images/lecture.png' )  )
   self.connect( self.pause, SIGNAL("clicked()"), self.lecture )
     
   suivant = QPushButton()
   suivant.setIcon( QIcon ( CHEMIN +'Images/suivant.png' )  )
   self.connect( suivant, SIGNAL("clicked()"), self.sui )
     
   precedent = QPushButton()
   precedent.setIcon( QIcon ( CHEMIN +'Images/precedent.png' )  )
   self.connect( precedent, SIGNAL("clicked()"), self.pre )
   ##### fin boutons #####
  
   ##### labels #####
   self.titre = QLabel("Titre")
   self.artiste = QLabel("Artiste")
   ##### fin labels #####
  
   ##### le son  #####
   volume = QLabel()
   volume.setPixmap( QPixmap( CHEMIN + 'Images/volume.png' ) )
   ##### fin son #####
     
   ##### calques #####
   monWidget = QWidget()
   calque = QGridLayout()
  
   c_boutons = QHBoxLayout()
   c_boutons.addWidget(precedent)
   c_boutons.addWidget(self.pause)
   c_boutons.addWidget(suivant)
   c_boutons.addWidget(volume)
  
   calque.addWidget(self.artiste,1,0)
   calque.addWidget(self.titre,1,1)
   calque.addLayout(c_boutons,2,0,1,2)
  
   monWidget.setLayout(calque)
   self.setCentralWidget(monWidget)
   ##### fin calques #####

self.onLit indique si une musique est chargée.
self.onJoue indique le statut de la musique chargée.

Voilà( pensez à changer CHEMIN et self.maListe ) .

Maintenant place aux choses sérieuses, enfin c'est pas bien compliqué .

Il nous faut déclarer encore quelques attributs dans notre __init__:

self.monControleur = Phonon.MediaObject()
MediaObject() permet de gérer la musique (lecture, pause, ...) et les métas .
self.sortie = Phonon.AudioOutput( Phonon.MusicCategory )
Phonon.AudioOutput() : cette classe permet d'envoyer les données audio à notre carte son.
Phonon.MusicCategory : indique le type de notre appli.

Phonon.createPath( self.monControleur , sortie )
createPath() va lier self.monControleur à sortie ( pour qu'ils communiquent ) .

p_volume = Phonon.VolumeSlider(self.sortie)
Permet d'instancier notre régulateur de son.
Voilà on peut réguler le son, difficile n'est-ce pas?

self.barre=Phonon.SeekSlider(self.monControleur)
Et voilà, on a notre barre de temps( je sais pas comment on appelle ca ) pour chaque musique (via self.monControleur )  .

   ##### lecteur #####
   self.monControleur = Phonon.MediaObject ()
   self.sortie = Phonon.AudioOutput( Phonon.MusicCategory)
   p_volume = Phonon.VolumeSlider(self.sortie)# rajouter dans "calques" : c_boutons.addWidget(p_volume)
   Phonon.createPath( self.monControleur , sortie)
   self.barre=Phonon.SeekSlider(self.monControleur)
   ##### fin lecteur #####


Maintenant, il faut créer nos méthodes sui, pre et lecture.

def sui(self):
   if len(self.maListe) > 0 :
  
   if self.maChanson == len(self.maListe) -1 :
   self.maChanson = 0
  
   else :
   self.maChanson +=1
  
   self.onLit = False
   self.lecture()


La méthode sui() n'est qu'une succession de conditions.
Si la liste de lecture (self.maListe) n'est pas vide alors:
on incrémente maChanson sauf si on arrive à la fin de la liste, auquel cas on recommence du début.
on met self.onLit à False.
Ensuite on lance lecture() .

La méthode pre() est identique, donc je ne l'expliquerai pas.

def pre(self):
   if len(self.maListe) > 0 : :
  
   if self.maChanson > 0 :
   self.maChanson -= 1
  
   else :
   self.maChanson = len(self.maListe) -1
  
   self.onLit = False
   self.lecture()


Enfin, la méthode lecture() :

def lecture(self):
   if len(self.maListe) > 0 :
   if self.onLit :
   if self.joue :
   self.pause.setIcon( QIcon ( CHEMIN +'Images/lecture.png')  )
   self.joue = False
   self.monControleur.pause()
   else : 
   self.pause.setIcon( QIcon ( CHEMIN +'Images/pause.png')  )
   self.joue = True
   self.monControleur.play()
  
   else :
   self.pause.setIcon( QIcon ( CHEMIN +'Images/pause.png')  )  
   self.onLit = True
   self.joue = True
   self.monControleur.setCurrentSource( Phonon.MediaSource( self.maListe[self.maChanson] ) )
   self.monControleur.play()


La condition de départ est que liste de lecture (self.maListe) ne soit pas vide .
- Si self.onLit est à True (la musique est déjà chargée) , alors  :
   - si self.joue est à True ( en lecture) :
   on change l'icone de self.pause
   on met self.joue à False
   et on appelle la méthode pause() de monControleur  .
   - sinon (en pause) :
   on change l'icone de self.pause
   on met self.joue à True
   et on appelle la méthode play() de monControleur  .
- Sinon, self.onLit est à False , alors :
   on change l'icone de self.pause
   on met self.onLità True et self.joue à True ( en lecture) .
   on charge notre nouvelle musique via la méthode setCurrentSource() de monControleur  .
   et on appelle la méthode play() .

Voilà, comme vous pouvez le constater, on ne se sert pas de la barre de progression, ni des deux labels déclarés.
On va s'en servir dans le prochain article, alors gardez le code .
Pour télécharger le fichier source, c'est par là :
ps : essayez de lire l'article sans CSS, parce que c'est horriblement moche...