PYTHON 2.7 FEUILLE n° 24 Dix BTS SIO juin 2019
Cours: DES BIPS , DES SONNERIES , DES SONS
# En même temps que Python 2.7 , de nombreux modules ont été installés
comme time , turtle , decimal , binascii , math , random, wave , winsound
.......etc. On peut donc les importer quand on en a besoin.
Aucune nouvelle installation de modules n'est nécéssaire pour jouer un son.
# Pour faire un seul bip il suffit de considérer:
from time import*
from Tkinter import*
def bip():
fen = Tk()
sleep(0) # Suspend l'exécution 0 secondes
fen.bell()
fen.quit()
Il y a une petite fenêtre vide, sans intérêt, qui s'ouvre quand on active bip()
On entend un seul bip.
# Pour générer plusieurs bips, il suffit de considérr un boucle for
from time import*
from Tkinter import*
def bips():
fen = Tk()
for i in range(5): # pour engendrer cinq bips identiques
sleep(1) # Suspend l'exécution1 seconde. Donc on a 1 secondes entre chaque bip
fen.bell()
fen.quit()
Cela génère cinq bips quand on active bips() .
# On peut mêler une fenêtre Turtle avec des dessins et des bips.
Par exemple on peut faire un compte à rebours:
from turtle import*
from time import*
from random import*
from Tkinter import*
def deplace(x,y):
penup(), goto(x,y),pendown()
def compte():
ht()
fen = Tk()
deplace(-50,150)
width(10)
write(" 10 SECONDES " )
deplace(0,80)
for i in range(11):
sleep(1) # Suspend l'exécution 1 seconde
a=10-i
penup(), forward(20),pendown()
width(10)
write(a)
fen.bell()
fen.quit()
En activant compte() il vient :
>>>
>>>compte
>>>
Puis :
Chaque apparition d'un entier fait un bip.
-----------------------------------------------------------------------------------------------------------------------
EXERCICE1 :
Donner un script , en Python 2.7, qui trace des cercles concentriques de plus en plus grand , en expansion.
--------------------------------------------------------------------------------------------------------------
REPONSE:
from turtle import*
from random import*
def deplace(x,y):
penup(),goto(x,y),pendown()
def evol():
r=3
ht()
circle(r)
speed(0)
E=["yellow","green"]
for i in range(30):
deplace(0,-5*i)
if i%2==0:
width(1)
color(E[0])
circle(r+5*i)
else:
width(3)
color(E[1])
circle(r+5*i)
mainloop()
En activant evol() on obtient:
>>>
>>> evol()
>>>
Puis à la fin :
Il y a expansion des cercles concentriques verts jusqu'au plus grand.
Autre possibilité:
from turtle import*
from random import*
def deplace(x,y):
penup(),goto(x,y),pendown()
def evol(x,y):
deplace(x,y) # Le centre du premier xercle a pour coord( x, y+r)
r=3
ht()
circle(r)
speed(0)
E=["yellow","green"]
for i in range(30):
penup(),right(90),forward(5),left(90), pendown()
if i%2==0:
width(1)
color(E[0])
circle(r+5*i)
else:
width(3)
color(E[1])
circle(r+5*i)
mainloop()
On obitient le même résultat mais en décidant du centre de coord ( x, y + r ) du premier cercle.
-------------------------------------------------------------------------------------------------------------------------------------------------------
EXERCICE 2 :
Donner un script, en Python 2.7, qui reprend ces cercles évolutifs dan un feu d'artifice.
---------------------------------------------------------------------------------------------------------------------------------------
REPONSE:
On peut proposer :
from turtle import*
from random import*
from math import*
def deplace(x,y):
penup(),goto(x,y),pendown()
def temporisateur():
for g in range(2*10**6):
g=g+1
def sol():
speed(0)
deplace(-220,-307)
width(19) , color("black"), forward(400), backward(200)
bgcolor("blue")
def jet1(j,angle): # Départ du premier tir
a=Turtle()
speed(0),color("violet")
left(angle)
width(4)
penup(), forward(11*j),pendown()
forward(3)
penup(),backward(11*j),
right(angle)
pendown()
def jet2(k,angle): # second tir
b=Turtle()
speed(0), width(4), color("violet")
left(angle)
penup(),forward(k*12),pendown()
forward(6)
penup(),backward(k*12),pendown()
right(angle)
def evol(x,y,couleur1,couleur2):
speed(0)
deplace(x,y)
r=0
ht()
circle(r)
E=[couleur1,couleur2]
for i in range(14):
penup(),right(90),forward(5),left(90), pendown()
if i%2==0:
width(1)
color(E[0])
circle(r+5*i)
else:
width(3)
color(E[1])
circle(r+5*i)
def feu():
deplace(-120,-294)
speed(0), width(4)
sol()
i=0
j=1
k=1
while i<22:
if i%2==0:
jet1(j,80)
j=j+1
else:
jet2(k,45)
k=k+1
i=i+1
c=Turtle
for j in range(2):
evol(55+60*j,-105+60*j,"yellow","orange")
evol(130,-130+60*j,"red","yellow")
evol(55+60*j,-105+60*j,"green","green")
evol(160+40*j,-130+0,"yellow","orange")
evol(130,-130+60*j,"red","orange")
clear()
bgcolor("blue")
deplace(-120,-294)
speed(0), width(4)
sol()
i=0
j=1
k=1
while i<22:
if i%2==0:
jet1(j,140)
j=j+1
else:
jet2(k,90)
k=k+1
i=i+1
for j in range(2):
evol(-140+60*j,-140+60*j,"green","orange")
evol(-45,-90+60*j,"red","yellow")
color("white")
deplace(-20,-200)
write(" FIN DU FEU D'ARTIFICE ")
ht()
mainloop()
En activant feu() on obtient :
>>>
>>> feu()
>>>
Puis:
La fin est:
-------------------------------------------------------------------------------------------------------------------------------------
EXERCICE 3:
Ecrire un script , en Python 2.7, qui présente un compte à rebours de 10 secondes avant
une explosion d'étoile en expansion.
----------------------------------------------------------------------------------------------------------
REPONSE:
On peut proposer:
from Tkinter import*
from time import*
from turtle import*
from random import*
def deplace(x,y):
penup(), goto(x,y),pendown()
def evol(x,y,couleur1,couleur2):
deplace(x,y)
r=1
ht()
circle(r)
speed(0)
E=[couleur1,couleur2]
for i in range(40):
penup(),right(90),forward(5),left(90), pendown()
if i%2==0:
width(2)
color(E[0])
circle(r+5*i)
else:
width(2)
color(E[1])
circle(r+5*i)
def commande():
ht()
deplace(-50,150)
width(10)
write(" VOUS DISPOSEZ DE 10 SECONDES AVANT HIROSHIMA MON AMOUR...." )
fen = Tk()
deplace(0,80)
for i in range(11):
sleep(1)
a=10-i
penup(), forward(20),pendown()
width(10)
write(a)
fen.bell()
deplace(-200,10)
write(" ZERO . ")
width(4)
bgcolor("orange")
evol(100,-120,"blue","yellow")
evol(100,-120,"red","red")
bgcolor("green")
fen.quit()
En activant commande() il vient:
>>>
>>> commande()
>>>
Puis:
Puis:
---------------------------------------------------------------------------------------------
EXERCICE 4:
Donner un script , en Python 2. 7, qui fait un petit air de bips.
----------------------------------------------------------------------------------------------------------
REPONSE :
On peut proposer:
from time import*
from Tkinter import*
from random import*
def bip(j):
fen = Tk()
for i in range( 3):
sleep(0.2)
fen.bell()
fen.quit()
fen=Tk()
for i in range(3):
sleep(0.5)
fen.bell()
for i in range(2):
sleep(0.6)
fen.bell()
fen=Tk()
def commande():
for j in range(2):
bip(j)
En activant commande() on obtient :
>>>
>>> commande()
>>>
Puis deux fois , une séries de trois bips puis une série de trois bips plus lents
puis une serie de deux bips plus lents
------------------------------------------------------------------------------------------------------------------------
EXERCICE 5:
Donner un script , en Python 2.7, qui semble faire vibrer un téléphone qui sonne.
-------------------------------------------------------------------------------------------------------------------
REPONSE:
On peut proposer :
from turtle import* # Tous ces modules sont déjà téléchargés en même temps que Python 2.7
import wave # Module pour le son
import math # Pour pouvoir utiliser la fonction x → sin( w x ) pour un son sinusoïdal
import binascii # Nécessaire pour le module wave qui utilise le système binaire
import winsound # Pour avoir la lecture audio ( en sortie vers la carte son de l'ordinateur)
winsound.PlaySound("son.wav",winsound.SND_FILENAME) # Lance aussitôt "son.wav"
def deplace(x,y):
penup(),goto(x,y),pendown()
def telephone(x,y,couleur):
deplace(x,y)
ht()
width(10),speed(0)
fillcolor(couleur)
begin_fill()
forward(200),right(90),forward(80),right(90),forward(50)
right(90),forward(30),left(90),forward(100)
left(90),forward(30),right(90),forward(50),right(90),forward(80),right(90)
end_fill()
def vibration():
bgcolor("grey")
ht()
E=["red","grey"]
for i in range(7):
if i%2==0:
telephone(0,0,E[0])
else:
telephone(0,0,E[1])
deplace(0,80)
width(5)
color("black")
write(" ALLO ! ALLO ! Y A QUIN QUIN !")
deplace(0,30)
write(" ALORS ! VOUS N'ENTENDEZ PAS ! ")
mainloop()
vibration() # Pour le déclenchement automatique après la sonnerie prioritaire
mainloop()
def sonnerie(): # Pour imiter une sonnerie de téléphone
NomFichier = "son.wav" # C'est le nom du fichier que lance winsound
BRUIT = wave.open(NomFichier,"w") # Instanciation ( Réserver un espace mémoire à l'objet BRUIT )
nbCanal = 2 # Deux canaux pour la stéréo
nbOctet = 1 # Taille d'un échantillon : 1 octet = 8 bits
fech = 44100 # Fréquence d'échantillonnage
frequenceG =440.0 # Fréquence du son du canal de gauche (Hz)
frequenceD =880.0 # Fréquence du son du canal de droite (Hz)
niveauG =1.0 # Niveau du son du canal de gauche (0 à 1)
niveauD =0.5 # Niveau du son du canal de droite (0 à 1)
duree = 2.5 # Durée du BRUIT en secondes
nbEchantillon = int(duree*fech) # Il y a de nombreux cœfficients multiplicateurs .
amplitudeG = 127.5*niveauG # Ils servent à amplifier, donc à rendre audible le son
amplitudeD = 127.5*niveauD
for i in range(0,nbEchantillon):
valG = wave.struct.pack("B",int(128.0 + amplitudeG*math.sin(2.0*math.pi*frequenceG*i/fech)))
valD = wave.struct.pack("B",int(128.0 + amplitudeD*math.sin(2.0*math.pi*frequenceD*i/fech)))
Le lancement est automatique car on a mis à la ligne vibration()
On obtient :
On entend la sonnerie, puis le téléphone apparaît et semble vibrer, enfin le texte devient visible
------------------------------------------------------------------------------------------------------------------------------------------------