gribouilli, pour laisser vos (petits) enfants taper sur votre clavier

Il y a presque trois ans que j’ai fait gribouilli (grabouilla ça faisait moins classe, et grybouilly, trop python. Pas facile de trouver un nom de programme…). C’est un petit programme qui se met en plein écran et qui affiche des formes géométriques et des images à l’écran lorsque l’on appuie sur les touches du clavier ou que l’on clique sur les boutons de la souris (et qui trace des lignes quand on bouge la souris).

De temps en temps, mon fils me demande s’il peut y « jouer ». Pour être franc, ce qui lui plaît c’est surtout qu’à chaque fois que l’on appuie sur une touche, il y a aussi un son qui est joué. Depuis qu’il a découvert monsieur patate (KTuberling) puis GCompris, il y joue beaucoup moins, mais cette semaine, il me la redemandé. Je me suis dit : « tiens, et si ça pouvait profiter à d’autres ? » Oui, c’est un peu prétencieux, mais si ça sert à une personne, ça me fera plaisir !

Il ne faut pas trop s’apesantir sur la qualité du code, il a beaucoup évolué, sans que je revienne dessus : d’abord que des formes, puis du son, puis des images qui correspondent éventuellement au son… Du coup, on voit quelques bouts de code qui gagneraient à être factorisés, mais c’est du temps que je préfère passer à écrire cet article ;]

J’ai pas tellement de plan pour cet article, on va donc sans transition, passer aux fonctionnalités :

Fonctionnalités

  • se met en plein écran
  • joue un son aléatoire à chaque appui de touche (dans le dossier sounds)
  • affiche une forme ou une image à chaque appui de touche (dans le dossier images)
  • si un nom de fichier image correspond plus ou moins au nom de fichier son joué, c’est cette image qui est affichée (par exemple si c’est dog_2.wav qui est jouée, alors dog_4.png peut être affichée (mais pas cat_2.svg))
  • une combinaison de touche pour quitter (à modifier dans le code si elle ne vous plait pas :þ)
  • une combinaison de touche pour tout supprimer
  • la souris trace des traits
  • les boutons affichent les formes/images

Défauts

  • la longueur des mots pour nettoyer/quitter est identique (le code pour nettoyer est venu après)
  • il faut faire attention à ce que verr.maj. ne soit pas enclenché pour nettoyer/quitter (et que le raccourci pour passer du clavier azerty vers le bépo non plus…)
  • pas vraiment du plein écran sur certains windows manager (comme awesome-wm). Je n’ai pas trop cherché pourquoi.
  • je n’ai pas bloqué les touches multimédia, y compris concernant le son… et plein de sons d’animaux, trop fort, c’est trop fort…

Conclusion

Voilà, pas grand chose à dire, si ce n’est que c’est sur bitbucket, et que j’ai inclus un script qui télécharge des sons sur http://soundbible.com/ (normalement un wget -r -nd -A.mp3 est suffisant, mais là il n’y a pas les liens directement sur les fichiers, du coup, il faut tricher un peu). Ah, si, il faut installer python-qt4-phonon pour que cela fonctionne.

Très rapidement, pour jouer un son avec phonon

from PyQt4.phonon import Phonon
...
        self.m_media = Phonon.MediaObject(self)
        audioOutput = Phonon.AudioOutput(Phonon.NotificationCategory, self)
        Phonon.createPath(self.m_media, audioOutput)

    def play(self):
            fic = QtCore.QString("/tmp/myfile.mp3")
            if (QtCore.QFile(fic).exists()):
                self.m_media.setCurrentSource(Phonon.MediaSource(fic))
                self.m_media.play()

Et pour coller une image, c’est encore plus simple :

qp = QtGui.QPainter()
img = QtGui.QImage()
img.load("/tmp/mypic.jpg")
qp.drawImage(x, y, img)

J’ai bien utilisé os.path.join et os.getcwd mais je n’ai pas autre chose que du GNU/Linux à la maison, donc je ne sais pas si ça marche sur autre chose, mais ça devrait !

À la prochaine.

Autres billets

Date: <2014-02-05>

Generated by Emacs 24.3.1 (Org mode 8.2.4) - Show Org source (htmlized)

CSS inspired by Tontof, colors by Chaotic Soul

Validate