OVH Cloud OVH Cloud

Lire un sons en python

17 réponses
Avatar
firelink.east
Voil=E0 je d=E9bute en python je viens de terminer les le=E7on du cours Rur-
ple ( http://rur-ple.sourceforge.net/en/rur.htm ) tr=E8s instructif on
y apprend en s'amusant des trucs comme -

- def , if , else elif , pass , not while , from and import object
oriented programing , tulpe , global , list , append , pop ,
dictionnary , str , int , class , del , return , for .. in , for ...
in .. range()
, join , len , designing new class , designing new class for change
the base of an existing class : __init__ , from 'module' import
'fonction' , from 'module' import * (all function of that module ) ,
try
,-

M=EAme si je maitrise pas encore tout :) La premier programme que je
souhaite faire est un inutilitaire qui m'a bien fait rire il y a
quelque ann=E9es mais dont j'ai pas encore vue l'=E9quivalent en sous
Linux . Ce soft a pour but simplement diff=E9rent sons pr=E9d=E9finie
(Ahh , Ohh , Wow .. ) lors qu'on clique sur un bouton . Rien de bien
sorcier j'ai commencer =E0 faire l'interface en TK , et voila lorsque
j'essaye de lui faire lire un sons (wav ou ogg ) rien ne sort . J'ai
test=E9 diff=E9rent module pyogg , pyvorbis , puis j'ai test=E9 libsnack
( http://www.speech.kth.se/snack/) . Il semblerait lorsque je lance
les commande dans le prompt cela le lit (en ouvrant xmms en meme temps
je n'ai pas de sons car /dev/dsp occup=E9 ) , sinon lorsque je lance le
script il me donne une erreur de syntaxe : soundtest():^
SyntaxError: invalid syntax
Script terminated. , voici mon code :

import sys
from Tkinter import *
root =3D Tk()
import tkSnack
tkSnack.initializeSnack(root)
mysound =3D tkSnack.Sound(load=3D'/usr/share/xulrunner/res/samples/
test.wav')
soundtest():
mysound.play
fen =3D Tk()
fen.title("Fen=EAtre compos=E9e =E0 l'aide de frames")
fen.geometry("157x178")
f1 =3D Frame(fen,bd =3D2, )
f1.pack(side =3D LEFT)
bou1=3DButton(f1, text=3D'Ah')
bou1.pack()
bou2 =3DButton(f1, text=3D'BoOOoo',command=3Dsoundtest)
bou2.pack()
bou3=3DButton(f1, text=3D'Clapping')
bou3.pack()
bou4=3DButton(f1, text=3D'Huh ? ')
bou4.pack()

f2 =3D Frame(fen, bd =3D2, )
f2.pack(side =3DRIGHT)
bou5=3DButton(f2, text=3D'Bouton')
bou5.pack()
bou6=3DButton(f2, text=3D'Bouton')
bou6.pack()
bou7=3DButton(f2, text=3D'Bouton')
bou7.pack()
bou8=3DButton(f2, text=3D'Bouton')
bou8.pack()
f3 =3D Frame(fen, bd =3D2, )
f3.pack(side =3D BOTTOM)

bou9=3DButton(f3, text=3D'hello')
bou9.pack()

fen.mainloop()




merci d'avance

7 réponses

1 2
Avatar
Jerome
wrote:
On 23 août, 13:30, Jerome wrote:
Bonjour

-snip-

wrote:
Au fait comment est ce que je peux lister
toute les fonctions d'un module en python ?
import string
dir(string)





merci


voila j'ai quasi fini le soft , reste juste quelque détails :


j'aimerais à la fois mettre les wav dans un répértoire , séparer du
script . et à la fois que le script puisse s'éxecuter autant sous
Linux que windows et Mac os x .

le problème vient du fait que la syntaxe des répértoire diffère sous
windows de Linux et Mac os x .(slash et backslash ) .


En général je fais quelque chose comme ça personnellement :

script_dir = sys.path[0]
my_path = './datas/file.png'

my_path = script_dir + my_path[1:].replace('/', os.sep)

Ca me permet de gérer facilement mes scripts sous linux et windows.

Si tu veux avoir des chenmins véritablement absolus, tu peux utiliser
sys.platform pour gérer des chemins différents suivant les os.


j'aimerais mettre un bouton exit en tout en dessous , j'avais créer
une nouvelle frame , mais le bouton se met toujours a coté . (right)
au lieu d en bas bien que j'ai defini la nouvelle frame avec side > BOTTOM

quelqu'un a t-il déjà utilisé Py2exe ? pour transformer un py
en .exe


oui, ça marche bien mais produit des applications un peu grosses en taille.


même chose pour Mac os x ( Py2app )

Même chose pour Linux (pour gerer les dependance ) autopackage peut
etre ?


je le gère avec distutils pour créer une install propre. Je préfère
laisser la responsabilité à l'utilisateur d'installer les modules
recquis, principalement pour des questions de licences.


voici le code :

import sys
from Tkinter import *
root = Tk()
import tkSnack
tkSnack.initializeSnack(root)


def Aaah():
AhhSound = tkSnack.Sound(load='/home/me/resource/crowd.exe.remake/
wav/crowd.exe.remake.0.2.Aaahh.wav')
AhhSound.play()
def Oohh():
OohhSound = tkSnack.Sound(load='/home/me/resource/crowd.exe.remake/
wav/crowd.exe.remake.0.2.Oohh.wav')
OohhSound.play()

def BOo():
BOoSound = tkSnack.Sound(load='/home/me/resource/crowd.exe.remake/
wav/crowd.exe.remake.0.1.BOo.wav')

BOoSound.play()

def WOW():
WOWsound = tkSnack.Sound(load='/home/me/resource/crowd.exe.remake/
wav/crowd.exe.remake.0.1.WOW.wav')
WOWsound.play()

def Clapping():
ClappingSound = tkSnack.Sound(load='/home/me/resource/
crowd.exe.remake/wav/crowd.exe.remake.0.1.Clapping.wav')
ClappingSound.play()

def Laughing():
LaughingSound = tkSnack.Sound(load='/home/me/resource/
crowd.exe.remake/wav/crowd.exe.remake.0.1.laughing.wav')
LaughingSound.play()

def Huh():
HuhSound = tkSnack.Sound(load='/home/me/resource/crowd.exe.remake/
wav/crowd.exe.remake.0.1.Huh.wav')
HuhSound.play()
def Yeah():
YeahSound = tkSnack.Sound(load='/home/me/resource/crowd.exe.remake/
wav/crowd.exe.remake.0.1.Yeah.wav')
YeahSound.play()

def Cool():
YeahSound = tkSnack.Sound(load='/home/me/resource/crowd.exe.remake/
wav/crowd.exe.remake.0.1.Yeah.wav')
YeahSound.play()


Un peu lourd comme syntaxe non ?

path_sound =
'/home/me/resource/crowd.exe.remake/wav/crowd.exe.remake.0.1.%s.wav'

def playsound(path_sound, sound_name):
sound = tkSnack.Sound(load=path_sound % sound_name)
sound.play()

Ca repose sur ton choix de nommage pour tes fichiers mais tu fais la
même chose avec une seule fonction :)




root.title("Foule controle")
root.geometry("157x178")
f1 = Frame(root, widthx , height= 138, bg="",bd=4 )
f1.pack(side = LEFT)
bou1=Button(f1, width =6,height=1, text='Aaah',commandªah)
bou1.pack()
bou2 =Button(f1, width =6,height=1, text='BoOOoo',command=BOo)
bou2.pack()
bou3=Button(f1, width =6,height=1,text='Clapping',command = Clapping)
bou3.pack()
bou4=Button(f1, width =6,height=1,text='Huh ? ',command = Huh)
bou4.pack()

f2 = Frame(root, widthx , height= 138, bg="")
f2.pack(side =LEFT)


bou5=Button(f2, width =6,height=1,text='Oohh', command = Oohh)
bou5.pack()

bou6=Button(f2, width =6,height=1, text='WOW !',command = WOW)
bou6.pack()
bou7=Button(f2, width =6,height=1, text='Laughing',command = Laughing)
bou7.pack()
bou8=Button(f2, width =6,height=1,text='Yeah',command=Yeah)
bou8.pack()


# frame pour accueillir le bouton exit
f3 = Frame(fen, width5, heightP )

f3.pack(side = BOTTOM)

# def Cool , encore besoin du code pour l exit
bou9=Button(f3, text='exit', command=Cool)
bou9.pack(side = BOTTOM)


root.mainloop()











Avatar
firelink.east

En général je fais quelque chose comme ça personnellement :

script_dir = sys.path[0]
my_path = './datas/file.png'

my_path = script_dir + my_path[1:].replace('/', os.sep)


pas tout saisi le point ne désigne pas un répértoire caché ? sans
point cela désignerait la racine ..




Un peu lourd comme syntaxe non ?

path_sound =
'/home/me/resource/crowd.exe.remake/wav/crowd.exe.remake.0.1.%s.wav'

def playsound(path_sound, sound_name):
sound = tkSnack.Sound(load=path_sound % sound_name)
sound.play()

Ca repose sur ton choix de nommage pour tes fichiers mais tu fais la
même chose avec une seule fonction :)



lorsque je met le code , le son se joue dès le lancement , et
lorsqu'on click sur le bouton il ne se joue pas du tout

par exemple :



root.title("Foule controle")
root.geometry("157x138")
f1 = Frame(root, widthx , height= 138, bg="",bd=4 )
f1.pack(side = LEFT)
bou1=Button(f1, width =6,height=1,
text='Aaah',command=playsound(path_sound , Aaah)
bou1.pack()

Avatar
Eric Brunel
On Fri, 24 Aug 2007 14:27:21 +0200, wrote:
[snip]
lorsque je met le code , le son se joue dès le lancement , et
lorsqu'on click sur le bouton il ne se joue pas du tout

par exemple :



root.title("Foule controle")
root.geometry("157x138")
f1 = Frame(root, widthx , height= 138, bg="",bd=4 )
f1.pack(side = LEFT)
bou1=Button(f1, width =6,height=1,
text='Aaah',command=playsound(path_sound , Aaah)


A part qu'il manque une parenthèse fermante - merci de faire un
copier/coller du *vrai* code, et pas de le réécrire... -, le comportement
que tu vois est tout à fait normal: quand tu crées le bouton, tu
*appelles* la fonction playsound en lui passant les paramètres path_sound
et Aaah, puis tu affectes la valeur *renvoyée* par la fonction à l'option
command du bouton. Vu que la fonction ne renvoie probablement rien, donc
None, tu as un bouton qui ne fait rien. Par contre, la fonction playsound
étant appelée, le son est joué à la création du bouton.

Pour faire ce que tu veux, il faut:

- Soit faire une fonction par son à jouer, sans paramètre, et passer le
nom de la fonction *sans parenthèses* à l'option command du bouton.
Exemple:
def playAaah():
playsound(path_sound, Aaah)
bou1=Button(f1, width =6,height=1,text='Aaah',command=playAaah)

- Soit utiliser lambda:
bou1=Button(f1, width =6,height=1,text='Aaah',command=lambda:
playsound(path_sound , Aaah))
Attention: ça pose souvent des problèmes d'espace de noms (grosso modo,
le lambda ne voit que les définitions globales, pas les locales)

- Soit utiliser les possibilités des dernières versions de Python pour la
programmation fonctionnelle. Etant scotché avec un Python 2.1, je ne
connais pas bien; je préfère que d'autres expliquent...

HTH
--
python -c "print ''.join([chr(154 - ord(c)) for c in
'U(17zX(%,5.zmz5(17l8(%,5.Z*(93-965$l7+-'])"

Avatar
Jerome
wrote:
En général je fais quelque chose comme ça personnellement :

script_dir = sys.path[0]
my_path = './datas/file.png'

my_path = script_dir + my_path[1:].replace('/', os.sep)


pas tout saisi le point ne désigne pas un répértoire caché ? sans
point cela désignerait la racine ..



le point désigne le répertoire courant mais c'est surtout une syntaxe
que je suis, j'aurais tout aussi bien pu mettre 'local://' à la place.

En gros tu peux définir tes chemins localement par rapport à
l'emplacement du script que tu lances et remplacer ce '.' par le
'sys.path[0]'. Cela te donne un chemin global correct que tu peux
utiliser pendant toute l'exécution du programme.


Avatar
firelink.east
On 24 août, 14:40, "Eric Brunel" wrote:
On Fri, 24 Aug 2007 14:27:21 +0200, wrote:

[snip]

lorsque je met le code , le son se joue dès le lancement , et
lorsqu'on click sur le bouton il ne se joue pas du tout

par exemple :

root.title("Foule controle")
root.geometry("157x138")
f1 = Frame(root, widthx , height= 138, bg="",bd=4 )
f1.pack(side = LEFT)
bou1=Button(f1, width =6,height=1,
text='Aaah',command=playsound(path_sound , Aaah)


A part qu'il manque une parenthèse fermante - merci de faire un
copier/coller du *vrai* code, et pas de le réécrire... -,


c'est un mauvais copier / coller vers le newsgroup , les parenthèses y
sont dans le code ..

le comportement
que tu vois est tout à fait normal: quand tu crées le bouton, tu
*appelles* la fonction playsound en lui passant les paramètres path_sou nd
et Aaah, puis tu affectes la valeur *renvoyée* par la fonction à l'op tion
command du bouton. Vu que la fonction ne renvoie probablement rien, donc
None, tu as un bouton qui ne fait rien. Par contre, la fonction playsound
étant appelée, le son est joué à la création du bouton.

Pour faire ce que tu veux, il faut:

- Soit faire une fonction par son à jouer, sans paramètre, et passer le
nom de la fonction *sans parenthèses* à l'option command du bouton.
Exemple:
def playAaah():
playsound(path_sound, Aaah)
bou1=Button(f1, width =6,height=1,text='Aaah',command=playAa ah)


c'est quasi identique au code de départ mis à part le path_sound
definie avant non ?



- Soit utiliser lambda:
bou1=Button(f1, width =6,height=1,text='Aaah',command=lambda:
playsound(path_sound , Aaah))



Attention: ça pose souvent des problèmes d'espace de noms (grosso modo,
le lambda ne voit que les définitions globales, pas les locales)
alors j'ai ajouter :


global Aaahh

ainsi que le code lambda , il me dit que Aaahh n'est pas définit ..


Avatar
Jerome
wrote:
On 24 août, 14:40, "Eric Brunel" wrote:
On Fri, 24 Aug 2007 14:27:21 +0200, wrote:

[snip]

lorsque je met le code , le son se joue dès le lancement , et
lorsqu'on click sur le bouton il ne se joue pas du tout
par exemple :
root.title("Foule controle")
root.geometry("157x138")
f1 = Frame(root, widthx , height= 138, bg="",bd=4 )
f1.pack(side = LEFT)
bou1=Button(f1, width =6,height=1,
text='Aaah',command=playsound(path_sound , Aaah)
A part qu'il manque une parenthèse fermante - merci de faire un

copier/coller du *vrai* code, et pas de le réécrire... -,


c'est un mauvais copier / coller vers le newsgroup , les parenthèses y
sont dans le code ..

le comportement
que tu vois est tout à fait normal: quand tu crées le bouton, tu
*appelles* la fonction playsound en lui passant les paramètres path_sound
et Aaah, puis tu affectes la valeur *renvoyée* par la fonction à l'option
command du bouton. Vu que la fonction ne renvoie probablement rien, donc
None, tu as un bouton qui ne fait rien. Par contre, la fonction playsound
étant appelée, le son est joué à la création du bouton.

Pour faire ce que tu veux, il faut:

- Soit faire une fonction par son à jouer, sans paramètre, et passer le
nom de la fonction *sans parenthèses* à l'option command du bouton.
Exemple:
def playAaah():
playsound(path_sound, Aaah)
bou1=Button(f1, width =6,height=1,text='Aaah',command=playAaah)


c'est quasi identique au code de départ mis à part le path_sound
definie avant non ?


Si tu fais comme ça oui. Mais tu limites les erreurs de copier/coller
(cf ta fonction Cool dans ton post précédent :) )




- Soit utiliser lambda:
bou1=Button(f1, width =6,height=1,text='Aaah',command=lambda:
playsound(path_sound , Aaah))



Attention: ça pose souvent des problèmes d'espace de noms (grosso modo,
le lambda ne voit que les définitions globales, pas les locales)
alors j'ai ajouter :


global Aaahh

ainsi que le code lambda , il me dit que Aaahh n'est pas définit ..


global c'est le mal...

Avec le code que je t'ai proposé tu dois faire plutôt :

aaah_fun = lambda:playsound(path_sound , 'Aaah')
bou1=Button(f1, width =6,height=1,text='Aaah',commandªah_fun)



Avatar
Laurent Pointal
wrote:
En général je fais quelque chose comme ça personnellement :

script_dir = sys.path[0]
my_path = './datas/file.png'

my_path = script_dir + my_path[1:].replace('/', os.sep)


pas tout saisi le point ne désigne pas un répértoire caché ? sans
point cela désignerait la racine ..



le point désigne le répertoire courant mais c'est surtout une syntaxe
que je suis, j'aurais tout aussi bien pu mettre 'local://' à la place.

En gros tu peux définir tes chemins localement par rapport à
l'emplacement du script que tu lances et remplacer ce '.' par le
'sys.path[0]'. Cela te donne un chemin global correct que tu peux
utiliser pendant toute l'exécution du programme.


modulo qu'il ne modifie pas le répertoire courant au cours de
l'exécution... il vaut mieux utiliser dès l'initialisation du script
abspath() pour transformer le répertoire relatif en répertoire absolu et
être tranquille par la suite.

Voir aussi la variable __file__ qui contient le nom du fichier module
courant (je la préfère à sys.argv[0]).

Pour tester:

import sys
from os.path import abspath

print sys.argv[0]
print abspath(sys.argv[0])
print __file__
print abspath(__file__)



Enfin, comme ça a déjà été dit, préférer de loin l'utilisation des
fonctions join, split, basename, dirname... du module os.path plutôt que
de faire des concaténations de . / à la mano. C'est plus portable,
plus propre, et moins sujet à erreurs.
Cf http://docs.python.org/lib/module-os.path.html


A+

Laurent.



1 2