En pratique

De TARENTINO
Aller à la navigationAller à la recherche
Array

test


(Opérateurs:Magenta)
(Méthodes:Green)
(Fonctions:Red)

Accueil
Connexion
Déconnexion
Aide
Admin
Ft.png

En pratique

  • Appliquons maintenant la théorie à la pratique.
  • Tout n'est pas encore intégré

Infos utiles

  • Connaitre la version de Python
1 import sys
2 print(sys.version_info)

Index des modules d'extension Python

Exercices

Python Niveau 1 (Dominique)

Sommes de 2 nombres

 1 # PROGRAMME sommeNombres
 2 #VAR
 3 nombre1 : int
 4 nombre2 : int
 5 somme : int
 6 #DEBUT
 7 nombre1 = int(input("Saisir le premier nombre : "))
 8 nombre2 = int(input("Saisir le deuxième nombre : "))
 9 somme = nombre1 + nombre2
10 print("La somme des 2 nombres est : " , somme)
11 #FIN

Ascenceur 01

 1 # Variables
 2 PorteCabineEstOuverte:bool
 3 lesEtagesEstES:[bool]=[true,
 4                        true,
 5                        false,
 6                        true]
 7 #lesEtagesEstES[1]=false
 8 EntrainementEtatDepl:str        # Arreté
 9 EtageCourant:int
10 EtageAppel:int
11 # Debut
12 EntrainementEtatDepl="Arreté"
13 EtageCourant=1
14 #if (EntrainementEtatDepl=="Arreté") :
15 EtageAppel=int(input("De quel étage appelez vous ? "))
16 # si EtageCourant < EtageAppel And EntrainementEtatDepl=Arreté and PorteCabineEstOuverte=false
17 if (EtageAppel > EtageCourant) :
18     # descente
19     print("Faire monter l'entrainement de la cabine !")
20     print("La cabine est en montée et ouverte False à l'étage ", EtageCourant)
21 else :
22     if (EtageAppel < EtageCourant) :
23         # si EtageCourant < EtageAppel And EntrainementEtatDepl=Arreté and PorteCabineEstOuverte=true
24         # Montée
25         print("Faire descendre l'entrainement de la cabine !")
26         print("La cabine est en descente et ouverte False à l'étage ", EtageCourant)
27     else :
28         print("Déjà au bon étage !!!! Faire ouvrir les portes")
29     # fin de si
30 # fin de si
31 print("La cabine est ",EntrainementEtatDepl, " et ouverte à l'étage ", EtageCourant)
32 # Fin

Ascenceur 02

 1 """"
 2 NAME        : ascenseur.py
 3 Description : Programme de pilotage d'un ascenseur - V1
 4 """
 5 # PROGRAMME ascenseur
 6 #
 7 # TYPES
 8 # Nous n'utilisons que des types natifs du langage (int, str ...), il n'est donc pas nécessaire de définir des types de données : ils existent
 9 #
10 # VAR
11 etatEntrainement : str = "ARRETE" 		# Déclaration d'une donnée variable de type string et initialisation
12 										# Un entrainement arrêté
13 porteCabineEstOuverte : bool = False	# Déclaration d'une donnée variable de type booléen et initialisation
14 										# Une porte de cabine ouverte
15 										
16 										
17 etageCourantCabine : int = 1			# Déclaration d'une donnée variable de type entier et initialisation
18 										# Une cabine est à l'étge 1
19 etageDAppel : int  = -1					# Déclaration d'une donnée
20 # variable de type entier et initialisation
21 										# Aucun étage appelé (valeur -1)
22 lesEtagesEstES : [bool]=[True,True,False,True]
23 
24 n : int=0
25 
26 #
27 # DEBUT
28 print("	Debut du programme 3")
29 while n<4 :
30 	print("L'etage " , n , " est " ,lesEtagesEstES[n])
31 	n=n+1
32 print("	La cabine est", etatEntrainement, "et ouverte", porteCabineEstOuverte, "à l'étage", etageCourantCabine)
33 
34 # L'usager appelle l'ascenseur
35 etageDAppel = int(input("De quel étage appelez-vous? "))
36 if (lesEtagesEstES[etageDAppel]==True) :
37 
38 	if (etageDAppel > etageCourantCabine) :
39 		print("FAIRE MONTER L'ENTRAINEMENT DE LA CABINE")
40 		etatEntrainement = "EN_MONTEE"
41 	else :
42 		if (etageDAppel < etageCourantCabine) :
43 			print("FAIRE DESCENDRE L'ENTRAINEMENT DE LA CABINE")
44 			etatEntrainement = "EN_DESCENTE"
45 		else :
46 			#La cabine se tient déjà à l'étage demandé : il faut juste ouvrir la porte
47 			print("FAIRE OUVRIR LA PORTE DE LA CABINE")
48 			porteCabineEstOuverte = True
49 	print("	La cabine est", etatEntrainement, "et ouverte", porteCabineEstOuverte, "à l'étage", etageCourantCabine)
50 
51 	# Saisie de l'étage auquel arrive la cabine
52 	if ( etageCourantCabine != etageDAppel) :
53 		etageCourantCabine = int(input("La cabine arrive à quel étage? "))
54 		if (etageCourantCabine == etageDAppel) :
55 			print("FAIRE ARRETER L'ENTRAINEMENT")
56 			etatEntrainement = "ARRETE"
57 			print("FAIRE OUVRIR LA PORTE DE LA CABINE")
58 			porteCabineEstOuverte = True
59 			print("	La cabine est", etatEntrainement, "et ouverte", porteCabineEstOuverte, "à l'étage",
60 				  etageCourantCabine)
61 
62 	# Saisie de l'étage auquel arrive la cabine
63 	if ( etageCourantCabine != etageDAppel) :
64 		etageCourantCabine = int(input("La cabine arrive à quel étage? "))
65 		if (etageCourantCabine == etageDAppel) :
66 			print("FAIRE ARRETER L'ENTRAINEMENT")
67 			etatEntrainement = "ARRETE"
68 			print ("FAIRE OUVRIR LA PORTE DE LA CABINE")
69 			porteCabineEstOuverte = True
70 			print("	La cabine est", etatEntrainement, "et ouverte", porteCabineEstOuverte, "à l'étage",
71 				  etageCourantCabine)
72 
73 	# Saisie de l'étage auquel arrive la cabine
74 	if ( etageCourantCabine != etageDAppel) :
75 		etageCourantCabine = int(input("La cabine arrive à quel étage? "))
76 		if (etageCourantCabine == etageDAppel) :
77 			print("FAIRE ARRETER L'ENTRAINEMENT")
78 			etatEntrainement = "ARRETE"
79 			print("FAIRE OUVRIR LA PORTE DE LA CABINE")
80 			porteCabineEstOuverte = True
81 			print("	La cabine est", etatEntrainement, "et ouverte", porteCabineEstOuverte, "à l'étage",
82 				  etageCourantCabine)
83 else :
84 	print("etage FERME")
85 print("	Fin du programme")
86 #
87 # FIN

Ascenceur 03

  1 """"
  2 NAME        : ascenseur.py
  3 Description : Programme de pilotage d'un ascenseur - V2 - Tableaux, structures, boucles
  4 """
  5 #
  6 # PROGRAMME ascenseur
  7 # TYPES
  8 from enum import Enum # Truc syntaxique que l'on ne comprend pas encore
  9 class EnumEtatEnt (Enum) :  # Définition d'un type énumération
 10 	ARRETE = 1
 11 	EN_MONTEE = 2
 12 	EN_DESCENTE = 3
 13 
 14 class EnumEtatPorte (Enum) :
 15 	FERME = 1
 16 	OUVERT = 2
 17 
 18 class EtatCabine (Enum) :
 19 	ARRETE_FERME = 1
 20 	ARRETE_OUVERT = 2
 21 	EN_DESCENTE_FERME = 3
 22 	EN_MONTEE_FERME = 4
 23 
 24 #Constante NB_ETAGES = 4 - Le nombre d'étages de l'ascenseur est 4, RDC, étage 0, inclus - Il y a donc 3 étages proprement dits
 25 #Constante NUM_PORTE_CABINE = 4 - Le numéro de la porte de cabine est 4 (les premiers numéros correspondent à des portes d'étage)
 26 
 27 from dataclasses import dataclass # Truc syntaxique que l'on ne comprend pas encore
 28 @dataclass                        # Autre truc syntaxique ...
 29 class Cabine :                    # Définition d'un type structure Cabine
 30 	etat : EtatCabine
 31 	etageCourant : int
 32 	numPorte: int
 33 
 34 @dataclass
 35 class Etage :                      # Définition d'un type structure Etage
 36 	estES : bool
 37 	estEteint : bool
 38 	numPorte : int
 39 #
 40 # VAR
 41 
 42 def init() :
 43 	print("   L'entrainement est", etatEntrainement)
 44 	print("   La porte de la cabine est dans l'état ", lesEtatPortes[laCabine.numPorte])
 45 	print("   La cabine est", laCabine.etat, "à l'étage ", laCabine.etageCourant)
 46 
 47 etatEntrainement : EnumEtatEnt = EnumEtatEnt.ARRETE 	# Déclaration d'une donnée variable de type énumération et initialisation -
 48 																# 1 entrainement, arrêté
 49 lesEtatPortes : [EnumEtatPorte] = [EnumEtatPorte.FERME, EnumEtatPorte.FERME,EnumEtatPorte.FERME,EnumEtatPorte.FERME,EnumEtatPorte.FERME] 	# Déclaration d'une donnée variable de type tableau d'énumération et initialisation
 50 																												# 5 portes fermées - 4 portes d'étage et 1 porte de cabine (la dernière)
 51 laCabine : Cabine = Cabine(EtatCabine.ARRETE_FERME, 1, 4)           	# Déclation d'une donnée variable de type structure et initialisation
 52 															# 1 cabine, arrêté fermée, à l'étage 1 et avec la porte 4
 53 lesEtages : [Etage] = [Etage(True,True,0), Etage(True,True,1), Etage(False,True,2), Etage(True,True,3)]  # Déclaration d'une donnée variable de type tableau de 4 booléens et initialisation
 54 																									   # 4 étages, chaque étage, en service, éteint, avec une porte de son numéro
 55 etageDAppel : int  = -1 	# Déclaration d'une donnée variable de type entier et initialisation
 56 							# Aucun étage appelé (valeur -1)
 57 #
 58 # DEBUT
 59 print("   Début du programme 9")
 60 
 61 # Affichage état de l'ascenseur
 62 # Affichage état complet de la cabine
 63 print("   L'entrainement est", etatEntrainement)
 64 print("   La porte de la cabine est dans l'état ", lesEtatPortes[laCabine.numPorte])
 65 print("   La cabine est", laCabine.etat, "à l'étage ", laCabine.etageCourant)
 66 
 67 #Affichage état complet des étages
 68 """""
 69 numEtage = 0
 70 while numEtage < 4  :# NB_ETAGES
 71 	print("   L'étage ", numEtage, "est es ", lesEtages[numEtage].estES, ", éteint ", lesEtages[numEtage].estEteint,
 72 		  "numéro de porte ", lesEtages[numEtage].numPorte,
 73 		  "dans l'état ", lesEtatPortes[lesEtages[numEtage].numPorte])
 74 	numEtage = numEtage + 1
 75 """	
 76 for numEtage in range(0,4) :
 77 	print("   L'étage ", numEtage, "est es ", lesEtages[numEtage].estES, ", éteint ", lesEtages[numEtage].estEteint,
 78 		  "numéro de porte ", lesEtages[numEtage].numPorte,
 79 		  "dans l'état ", lesEtatPortes[lesEtages[numEtage].numPorte])
 80 # L'usager appelle l'ascenseur
 81 etageDAppel = int(input("De quel étage appelez-vous? "))
 82 if lesEtages[etageDAppel].estES :
 83 	if (etageDAppel > laCabine.etageCourant) :
 84 		print("FAIRE MONTER L'ENTRAINEMENT DE LA CABINE")
 85 		etatEntrainement = EnumEtatEnt.EN_MONTEE
 86 		laCabine.etat = EtatCabine.EN_MONTEE_FERME
 87 	else :
 88 		if (etageDAppel < laCabine.etageCourant) :
 89 			print("FAIRE DESCENDRE L'ENTRAINEMENT DE LA CABINE")
 90 			etatEntrainement = EnumEtatEnt.EN_DESCENTE
 91 			laCabine.etat = EtatCabine.EN_DESCENTE_FERME
 92 		else :
 93 			#La cabine se tient déjà à l'étage demandé : il faut juste ouvrir les portes
 94 			print("FAIRE OUVRIR LA PORTE NUMERO : ", laCabine.numPorte)
 95 			lesEtatPortes[laCabine.numPorte] = EnumEtatPorte.OUVERT
 96 			print("FAIRE OUVRIR LA PORTE NUMERO : ", lesEtages[etageDAppel].numPorte)
 97 			lesEtatPortes[lesEtages[etageDAppel].numPorte] = EnumEtatPorte.OUVERT
 98 			laCabine.etat = EtatCabine.ARRETE_OUVERT
 99 	# Affichage état complet de la cabine
100 	print("   L'entrainement est", etatEntrainement)
101 	print("   La porte de la cabine est dans l'état ", lesEtatPortes[laCabine.numPorte])
102 	print("   La cabine est", laCabine.etat, "à l'étage ", laCabine.etageCourant)
103 	while ( laCabine.etageCourant != etageDAppel) : 	# La cabine n'est pas à l'étage d'appel
104 		# Saisie de l'étage auquel arrive la cabine
105 		laCabine.etageCourant = int(input("La cabine arrive à quel étage? "))
106 		if (laCabine.etageCourant == etageDAppel) :
107 			print("FAIRE ARRETER L'ENTRAINEMENT")
108 			etatEntrainement = EnumEtatEnt.ARRETE
109 			print("FAIRE OUVRIR LA PORTE NUMERO : ", laCabine.numPorte)
110 			lesEtatPortes[laCabine.numPorte] = EnumEtatPorte.OUVERT
111 			print("FAIRE OUVRIR LA PORTE NUMERO : ", lesEtages[etageDAppel].numPorte)
112 			lesEtatPortes[lesEtages[etageDAppel].numPorte] = EnumEtatPorte.OUVERT
113 			laCabine.etat = EtatCabine.ARRETE_OUVERT
114 		# Affichage état complet de la cabine
115 		print("   L'entrainement est", etatEntrainement)
116 		print("   La porte de la cabine est dans l'état ", lesEtatPortes[laCabine.numPorte])
117 		print("   La cabine est", laCabine.etat, "à l'étage ", laCabine.etageCourant)
118 else :
119 	print("   L'appel ne peut être pris en compte car l'étage n'est pas en service")
120 
121 print("   Fin du programme")
122 #
123 # FIN

Ascenceur 04

  1 """"
  2 NAME        : ascenseur.py
  3 Description : Programme "ascenseur", programme de pilotage d'un ascenseur - V3 - Sous-programmes
  4 """
  5 # PROGRAMME ascenseur
  6 #
  7 # TYPES
  8 from enum import Enum # Truc syntaxique que l'on ne comprend pas encore
  9 class EnumEtatEnt (Enum) :  # Définition d'un type énumération
 10 	ARRETE = 1
 11 	EN_MONTEE = 2
 12 	EN_DESCENTE = 3
 13 
 14 class EnumEtatPorte (Enum) :
 15 	FERME = 1
 16 	OUVERT = 2
 17 
 18 class EtatCabine (Enum) :
 19 	ARRETE_FERME = 1
 20 	ARRETE_OUVERT = 2
 21 	EN_DESCENTE_FERME = 3
 22 	EN_MONTEE_FERME = 4
 23 
 24 #Constante NB_ETAGES = 4 - Le nombre d'étages de l'ascenseur est 4, RDC, étage 0, inclus - Il y a donc 3 étages proprement dits
 25 #Constante NUM_PORTE_CABINE = 4 - Le numéro de la porte de cabine est 4 (les premiers numéros correspondent à des portes d'étage)
 26 
 27 from dataclasses import dataclass # Truc syntaxique que l'on ne comprend pas encore
 28 @dataclass                        # Autre truc syntaxique ...
 29 class Cabine :                    # Définition d'un type structure Cabine
 30 	etat : EtatCabine
 31 	etageCourant : int
 32 	numPorte: int
 33 
 34 @dataclass
 35 class Etage :                      # Définition d'un type structure Etage
 36 	estES : bool
 37 	estEteint : bool
 38 	numPorte : int
 39 #
 40 # VAR
 41 etatEntrainement : EnumEtatEnt = EnumEtatEnt.ARRETE 	# Déclaration d'une donnée variable de type énumération et initialisation -
 42 																# 1 entrainement, arrêté
 43 lesEtatPortes : [EnumEtatPorte] = [EnumEtatPorte.FERME, EnumEtatPorte.FERME,EnumEtatPorte.FERME,EnumEtatPorte.FERME,EnumEtatPorte.FERME] 	# Déclaration d'une donnée variable de type tableau d'énumération et initialisation
 44 																												# 5 portes fermées - 4 portes d'étage et 1 porte de cabine (la dernière)
 45 laCabine : Cabine = Cabine(EtatCabine.ARRETE_FERME, 1, 4)           	# Déclation d'une donnée variable de type structure et initialisation
 46 															# 1 cabine, arrêté fermée, à l'étage 1 et avec la porte 4
 47 lesEtages : [Etage] = [Etage(True,True,0), Etage(True,True,1), Etage(False,True,2), Etage(True,True,3)]  # Déclaration d'une donnée variable de type tableau de 4 booléens et initialisation
 48 																									   # 4 étages, chaque étage, en service, éteint, avec une porte de son numéro
 49 etageDAppel : int  = -1 	# Déclaration d'une donnée variable de type entier et initialisation
 50 							# Aucun étage appelé (valeur -1)
 51 #
 52 # SOUS-PROGRAMME afficherEtatCompletCabine
 53 def afficherEtatCompletCabine() :
 54 	# DEBUT
 55 	print("   L'entrainement est", etatEntrainement)
 56 	print("   La porte de la cabine est dans l'état ", lesEtatPortes[laCabine.numPorte])
 57 	print("   La cabine est", laCabine.etat, "à l'étage ", laCabine.etageCourant)
 58 	# FIN
 59 # FIN SOUS-PROGRAMME
 60 #
 61 # SOUS-PROGRAMME calculerEtatCabine - retourne une valeur de type EtatCabine
 62 def calculerEtatCabine() :
 63 	# VAR LOC
 64 	result : EtatCabine
 65 	# DEBUT
 66 	if (etatEntrainement == EnumEtatEnt.ARRETE ) :
 67 		if (lesEtatPortes[laCabine.numPorte] == EnumEtatPorte.FERME) :
 68 			result = EtatCabine.ARRETE_FERME
 69 		else :
 70 			result = EtatCabine.ARRETE_OUVERT
 71 	elif (etatEntrainement == EnumEtatEnt.EN_DESCENTE ) :
 72 		result = EtatCabine.EN_DESCENTE_FERME
 73 	else :
 74 		result = EtatCabine.EN_MONTEE_FERME
 75 	return result
 76 	# FIN
 77 # FIN SOUS-PROGRAMME
 78 
 79 # DEBUT
 80 print("   Début du programme 10")
 81 # Affichage état de l'ascenseur
 82 # Affichage état complet de la cabine
 83 afficherEtatCompletCabine()
 84 #Affichage état complet des étages
 85 for numEtage in range(0,4) :
 86 	print("   L'étage ", numEtage, "est es ", lesEtages[numEtage].estES, ", éteint ", lesEtages[numEtage].estEteint,
 87 		  "numéro de porte ", lesEtages[numEtage].numPorte,
 88 		  "dans l'état ", lesEtatPortes[lesEtages[numEtage].numPorte])
 89 # L'usager appelle l'ascenseur
 90 etageDAppel = int(input('De quel étage appelez-vous? '))
 91 if lesEtages[etageDAppel].estES :
 92 	if (etageDAppel > laCabine.etageCourant) :
 93 		print("FAIRE MONTER L'ENTRAINEMENT DE LA CABINE")
 94 		etatEntrainement = EnumEtatEnt.EN_MONTEE
 95 		laCabine.etat = calculerEtatCabine()
 96 	else :
 97 		if (etageDAppel < laCabine.etageCourant) :
 98 			print("FAIRE DESCENDRE L'ENTRAINEMENT DE LA CABINE")
 99 			etatEntrainement = EnumEtatEnt.EN_DESCENTE
100 			laCabine.etat = calculerEtatCabine()
101 		else :
102 			#La cabine se tient déjà à l'étage demandé : il faut juste ouvrir les portes
103 			print("FAIRE OUVRIR LA PORTE NUMERO : ", laCabine.numPorte)
104 			lesEtatPortes[laCabine.numPorte] = EnumEtatPorte.OUVERT
105 			print("FAIRE OUVRIR LA PORTE NUMERO : ", lesEtages[etageDAppel].numPorte)
106 			lesEtatPortes[lesEtages[etageDAppel].numPorte] = EnumEtatPorte.OUVERT
107 			laCabine.etat = calculerEtatCabine()
108 	# Affichage état complet de la cabine
109 	afficherEtatCompletCabine()
110 	while ( laCabine.etageCourant != etageDAppel) : 	# La cabine n'est pas à l'étage d'appel
111 		# Saisie de l'étage auquel arrive la cabine
112 		laCabine.etageCourant = int(input('La cabine arrive à quel étage? '))
113 		if (laCabine.etageCourant == etageDAppel) :
114 			print("FAIRE ARRETER L'ENTRAINEMENT")
115 			etatEntrainement = EnumEtatEnt.ARRETE
116 			print("FAIRE OUVRIR LA PORTE NUMERO : ", laCabine.numPorte)
117 			lesEtatPortes[laCabine.numPorte] = EnumEtatPorte.OUVERT
118 			print("FAIRE OUVRIR LA PORTE NUMERO : ", lesEtages[etageDAppel].numPorte)
119 			lesEtatPortes[lesEtages[etageDAppel].numPorte] = EnumEtatPorte.OUVERT
120 			laCabine.etat = calculerEtatCabine()
121 		# Affichage état complet de la cabine
122 		afficherEtatCompletCabine()
123 else :
124 	print("	l'appel ne peut être pris en compte car l'étage n'est pas en service")
125 
126 print("   Fin du programme")
127 #
128 # FIN


Python Niveau 2 (Alex)

Exercice Hello Word

  • Sans commentaire, si tu n'y arrives pas alors laisses tomber Python....
#!/usr/bin/env python3
print("Hello, world ! bientôt l'été")
Hello, world ! bientôt l'été
  • Analyse:
    • Non trop facile !

Exercice Hello Word compatible Python 2 et Python 3

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import print_function
print("hello, world ! bientôt l'été")
Hello, world ! bientôt l'été
  • Analyse:
    • Il existe plusieurs versions de Python, je ne parlerai ici que de la version 2 et 3 car elles ont de principales différences.
Print
  • Le changement le plus radical étant surement de transformer le print en fonction.
Python 2: print "bonjour"
Python 3: print("bonjour")
  • Mais aussi:
Python 2                            Python 3   
print "Bonjour"                 →   print("Bonjour")
print "Bonjour", variable1      →   print("Bonjour", variable1)
print "\n".join([x, y])         →   print(x, y, sep="\n")
print >> sys.stderr, "erreur"   →   print("Erreur", file=sys.stderr)
print "une ligne ",             →   print("une ligne", end="")
Exceptions
Python 2                          Python 3
raise IOError, "file error"   →   raise IOError("file error")
raise "Erreur 404"            →   raise Exception("Erreur 404!")
raise TypeError, msg, tb      →   raise TypeError.with_traceback(tb)
Changement de nom de modules
Python 2             Python 3
_builtin__       →   builtins
ConfigParser     →   configparser
copy_reg         →   copyreg
cPickle          →   pickle
Queue            →   queue
repr             →   reprlib
SocketServer     →   socketserver
Tkinter          →   tkinter
_winreg          →   winreg
thread           →   _thread
dummy_thread     →   _dummy_thread
markupbase       →   _markupbase
Réorganisation
Python 2                        Python 3
xrange()                    →   range()
reduce()                    →   functools.reduce()
intern()                    →   sys.intern()
unichr()                    →   chr()
basestring()	            →   str()
long()	                    →   int()
itertools.izip()            →   zip()
itertools.imap()            →   map()
itertools.ifilter()         →   filter()
itertools.ifilterfalse()    →   itertools.filterfalse()
cookielib                   →   http.cookiejar
Cookie	                    →   http.cookies
htmlentitydefs              →   html.entities
HTMLParser                  →   html.parser
httplib                     →   http.client
Dialog                      →   tkinter.dialog
FileDialog                  →   tkinter.FileDialog
ScrolledText                →   tkinter.scolledtext
SimpleDialog                →   tkinter.simpledialog
Tix                         →   tkinter.tix
Tkconstants                 →   tkinter.constants
Tkdnd                       →   tkinter.dnd
tkColorChooser              →   tkinter.colorchooser
tkCommonDialog              →   tkinter.commondialog
tkFileDialog                →   tkinter.filedialog
tkFont                      →   tkinter.font
tkMessageBox                →   tkinter.messagebox
tkSimpleDialog              →   tkinter.simpledialog
robotparser                 →   urllib.robotparser
urlparse                    →   urllib.parse
cStringIO.StringIO()        →   io.StringIO
UserString                  →   collections.UserString
UserList                    →   collections.UserList

Nombres

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
nb_entier = 42
print(type(nb_entier))
nb_long = 300000000000
print(type(nb_long))
nb_complexe = 2+4j
print(type(nb_complexe))
# Changement dynamique de type
for nb in range(20):
    nb2 = nb ** nb
    print(nb2, type(nb2))
# Modulo
print("9 % 5 =", 9 % 5)
# Puissance
print("2 ** 4 =", 2 ** 4)
print('=' * 20)
# Constructeurs
nb = int("42")
print(nb, type(nb))
nb = float("42.123")
print(nb, type(nb))
nb = complex("2+5j")
print(nb, type(nb))
print('=' * 20)
print(hex(456))
print(oct(456))
print(bin(456))
print('=' * 20)
print(chr(65))
print(ord('A'))
  • Analyse:

Chaine

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
ch = "Une chaine double quote peut contenir des ' "
ch2 = 'Une chaine simple quote peut contenir des " '
ch3 = """Une chaine
qui s'etend
sur
plusieurs lignes"""
ch4 = "on peut mettre antislash pour afficher une \" dans une chaine double quote"
print(ch, type(ch))
print(ch2, type(ch2))
print(ch3, type(ch3))
print(ch4, type(ch4))
print('=' * 20)
# Unicode
ch_sans_unicode = "été"
ch_avec_unicode = "été"
print(ch_sans_unicode, type(ch_sans_unicode))
print(ch_avec_unicode, type(ch_avec_unicode))
print("Taille de la chaine ch_sans_unicode:", len(ch_sans_unicode))
print("Taille de la chaine ch_avec_unicode:", len(ch_avec_unicode))
print('=' * 20)
# Chaine raw
ch_sans_raw = 'une chaine\tavec\ndes caractères spéciaux'
ch_avec_raw = r'une chaine\tavec\ndes caractères spéciaux'
print(ch_sans_raw, type(ch_sans_raw))
print(ch_avec_raw, type(ch_avec_raw))
print('=' * 20)
ch = "bonjour tout le monde"
print("ch:", ch)
# Indicage
print("ch[2]:", ch[2])
print("ch[-2]:", ch[-2])
# Tranches de valeurs
print("ch[3:5]:", ch[3:5])
print("ch[-8:-2]:", ch[-8:-2])
print("ch[3:-2]:", ch[3:-2])
print("ch[3:]:", ch[3:])
print("ch[:-2]:", ch[:-2])
# Multiplication d'une chaine par un entier
ch2 = 'hello' * 4
print(ch2)
# On peut itérer sur une séquence
for car in ch:
    print(car)
# Concaténation
ch3 = ch + ch2
print(ch3)
# Appartenance
print("'xyz' in 'bonjour' ?", 'xyz' in 'bonjour')
print("'njo' in 'bonjour' ?", 'njo' in 'bonjour')
print('=' * 20)
# Masque d'affichage
notes = "Eleve: %-10s    Age: %2d   Note: %5.2f"
print("Masque:", notes)
print("Note Bart:", notes % ('Bart', 10, 5.55))
# Masque d'affectation
note_lisa = notes % ('Lisa', 12, 18.42)
print("note_lisa:", note_lisa)
print('=' * 20)
liste = [   ('Bart', 10, 1.23),
            ('Lisa', 12, 19.99),
            ('Homer', 42, 0.1)
        ]
for prenom, age, note in liste:
    print(notes % (prenom, age, note))
print('=' * 20)
for var in liste:
    print(var, type(var))
    #print(notes % (var[0], var[1], var[2]))
    print(notes % var)
# Test d'égalité : ==
ch = 'hello'
ch2 = 'hello'
print("ch == ch2 ?", ch == ch2)
# S'agit-il du même objet en mémoire : is
print("ch is ch2 ?", ch is ch2)
print('=' * 20)
# La classe chaine de caractères fournit un ensemble de méthodes
print("ch.upper():", ch.upper())
print("ch.center(40):", ch.center(40,'*'))
print('=' * 20)
# split
ch = "bonjour    tout  le          monde"
print("ch.split()", ch.split())
print("ch.split(' ')", ch.split(' '))
print("ch.split('o')", ch.split('o'))
print('=' * 20)
# replace
ch2 = ch.replace('o', 'X')
print("ch2:", ch2)
print("ch (non modifiée):", ch)
ch2 = ch.replace('jour', 'soir')
print("ch2:", ch2)
print('=' * 20)
# find
print("'ou' apparait a la position:", ch.find('ou'))
print('=' * 20)
# format
print("info: {0} {1} {2} {1} {0}".format('a', 'b', 'c'))
print('=' * 20)
# Espace de noms du programme principal
print(dir())
print('=' * 20)
# Attributs et méthodes d'une classe d'objet, ex. une chaine
print(dir(''))
print('=' * 20)
# Les chaines documentaires
def fct():
    "Ceci est la documentation de ma fonction"
    pass
print("Doc de la fonction fct():", fct.__doc__)
print('=' * 20)
print("Documentation de la classe str():", str.__doc__)
print('=' * 20)
print("Documentation de la méthode split de la classe str():", str.split.__doc__)
print('=' * 20)
print("Documentation de la méthode find de la classe str():", str.find.__doc__)


Python Niveau 3 (Jean François)

Loto

  • Écrire un programme qui réalise un tirage de Loto. Ce dernier est composé de:
    • 5 boules parmi 49 boules numérotées de 1 à 49
    • 1 boule “chance” parmi 10 boules numérotées de 1 à 10
# loto_01.py
import random
nb_boules=49
boules = [ x for x in range(1,nb_boules+1) ]
tirage = []
for boule in range(5):
    une_boule = boules[ random.randint(1,len( boules )) - 1 ]
    tirage.append( une_boule )
    boules.remove(une_boule)
chance = random.randint(1,10)
print(tirage, chance)
tirage.sort()
print(tirage)
  • Reprendre le programme de Loto précédent.
    • Utiliser une Classe “Loto” avec un constructeur qui génère un tirage.
Un tirage est composé de :
- Un numéro de tirage
- Les 5 boules
- Le numéro Chance
    • Ajouter une variable de classe qui mémorise les tirages ainsi qu’une méthode qui renvoie un tirage en fonction du numéro du tirage.
    • Créer une référence au dernier tirage appelé “dernierTirage” (ce n’est donc pas une instanciation)
    • Ajouter de la documentation et afficher celle-ci dans la console (introspection)
    • Ajouter un morceau de code qui peut générer une exception:
  • On demande un numéro de tirage et on affiche le tirage correspondant.
# loto_02.py
# v2: on utilise une Classe
""" Un module pour gerer des tirages de Loto """
import random

class Loto:
    """ Permet d'instancier des tirages de Loto """
    nb_boules=49
    les_tirages = []

    def __init__(self, num_tirage):
        """ Cree un tirage [num, les 5 boules, numero change]) """
        tirage_5_boules = []
        boules = [ x for x in range(1,Loto.nb_boules+1) ]
        for boule in range(5):
            une_boule = boules[ random.randint(1,len( boules )) - 1 ]
            tirage_5_boules.append( une_boule )
            boules.remove(une_boule)

        chance = random.randint(1,10)
        tirage_5_boules .sort()
        self.num = num_tirage
        self.cinqBoules = tirage_5_boules
        self.chance = chance
        Loto.les_tirages.append( self )

    def __str__(self):
        """ conversion d'un tirage en chaine """
        ch = "Numero: " + str(self.num) + " ,5 boules: "
        for i in range(5): ch += str( self.cinqBoules[i] ) + " - "
        ch += " ,Numero chance: "+ str(self.chance)
        return ch

    @classmethod
    def getUnTirage(cls, num ):
        """ Exemple de methode de classe """
        for t in cls.les_tirages:
            if t.num == num: return t
    return None

    if __name__ == "__main__":
        num = 100
        for i in range(5):
            un_tirage = Loto(num+i)
        le_dernier_tirage = un_tirage
        for t in Loto.les_tirages:
            print( t.num, t.cinqBoules, t.chance)

        print("Dernier: %s\n" % (str(le_dernier_tirage) ))
        try:
            num = int( input("Numero de tirage ? ") )
        except:
            print("ERREUR: saisie incorrect")
        else:
            print("Tirage 103: %s\n" % (str( Loto.getUnTirage( num ) ) ) )

Probabilité course lièvre/tortue

  • Main
import lievre.py
nb_coup:int=1000000
i:int=0
while i < nb_coup:
    lievre.py
    i=i+1
  • lievre2.py
###### lievre2.py: le lievre et la tortue
from random import *
total= 0
unGagnant = False
gagnant = None
while not unGagnant:
    de = randint(1,6)
    print ("Valeur du lance: ", de )
    total = total + de
    if de == 6 :
        gagnant = "Lievre"
        unGagnant = True
    elif total >= 6:
        gagnant = "Tortue"
        unGagnant = True
print ("Gagnant: ", gagnant )
  • Tortue.py
from random import *
lievre:int=0
i:int=1000000
dep=i
r:int=0
def golievre():
    total= 0
    while True:
        de = randint(1,6)
        if de == 6 :
            r=1
            break
        total = total + de
        if total >= 6:
            r=0
            break
    return r
# START
while i > 0:
    retour=golievre()
    #print(retour)
    if retour==1:
        lievre+=1
    i-=1
lievre_gagne=lievre
tortue_gagne=dep-lievre
pourcent=100*lievre_gagne/(tortue_gagne+lievre_gagne)
print(lievre, 'sur 1000000', pourcent)
  • Analyse:

Premiers programmes


Quizz

  • Python 2
Création d'un programme Quizz
  • Méthode split
  • Modules
  • Standard library
  • Module.fonction
  • Alias Fonction
  • Bonnes habitudes
  • from "module" import ....
  • module random, fonction choice
  • module string, fonction maketrans

Conversion en Python3

#!/usr/bin/python3
# -*- coding: utf-8 -*-
from random import choice
#from string import maketrans
accents="éèçêàôùû"
asciis="eeceaouu"
conversion=str.maketrans(accents, asciis)
adieu = ['fin', 'stop', 'bye', 'ciao']
reponse = 'X'
questions=['Allemagne:Berlin',
           'Autriche:Vienne',
           'Belgique:Bruxelle',
           'Bulgarie:Sofia',
           'Chypre:Nicosie',
           'Danemark:Copenhague']
print('Donner la capitale du pays....')
print('Répondre "fin", "bye", ou "ciao" pour arrêter')
while reponse not in adieu:
    quest=choice(questions)
    reponse=input(quest.split(':')[0]+'? ').lower()
    if reponse not in adieu:
        if reponse.translate(conversion)==quest.split(':')[1].lower():
            print(':)')
        else:
            print("Faux, c'est",quest.split(':')[1])


Structures Conditionnelles

Déterminer si une année saisie par l'utilisateur est bissextile. Il s'agit d'un sujet très prisé des enseignants en informatique quand il s'agit d'expliquer les conditions. Mille pardons, donc, à ceux qui ont déjà fait cet exercice dans un autre langage mais je trouve que ce petit programme reprend assez de thèmes abordés dans ce chapitre pour être réellement intéressant.
Les règles qui déterminent si une année est bissextile ou non.
Une année est dite bissextile si c'est un multiple de 4, sauf si c'est un multiple de 100. Toutefois, elle est considérée comme bissextile si c'est un multiple de 400.
Si une année n'est pas multiple de 4, on s'arrête là, elle n'est pas bissextile.
Si elle est multiple de 4, on regarde si elle est multiple de 100.
Si c'est le cas, on regarde si elle est multiple de 400.
Si c'est le cas, l'année est bissextile.
Sinon, elle n'est pas bissextile.
Sinon, elle est bissextile.
Graphviz.jpg
digraph G {
  subgraph cluster_0 {
    style=filled;
    color=lightgrey;
    node [style=filled,color=white];
    a0 -> test_multiple4
    test_multiple4 -> test_multiple100 [label="oui"]
    test_multiple100 -> end_no [label="non"; color="red"]
    test_multiple100 -> test_multiple400 [label="oui"]
    test_multiple400 -> end_yes [label="oui"]
    test_multiple400 -> end_no [label="non"; color="red"]
    label = "algorythme";
  }
  subgraph cluster_1 {
    node [style=filled]
    label = "variables"
    b0 -> int
    var_multiple4 -> bool
    var_multiple100 -> bool
    var_multiple400 -> bool
    on [label="O/N"]
    on -> bool
    var_multiple4 -> on [ color="blue" ]
    var_multiple100 -> on [ color="blue" ]
    var_multiple400 -> on [ color="blue" ]
    color=blue
  }
  a0 [color=yellow; label="Demander l'année"]
  b0 [label="annee"]
  test_multiple4 [shape=Mdiamond; color=cyan; label="Est ce un multiple de 4?"]
  test_multiple100 [shape=Mdiamond; color=cyan; label="Est ce un multiple de 100?"]
  test_multiple400 [shape=Mdiamond; color=cyan; label="Est ce un multiple de 400?"]
  var_multiple4 [label="multiple4"] 
  start [style=filled; shape=Mdiamond; color=bisque; label="Déterminer si une année\nsaisie par l'utilisateur\nest bissextile."];
  int [style=filled; shape=polygon; color="chocolate1"; label="int"]
  bool [style=filled; shape=polygon; color="chocolate1"; label="boolean"]
  end_no [style=filled; shape=Msquare; color=red; label="non"]
  end_yes [style=filled; shape=Msquare; color=chartreuse; label="Oui"]
  start -> a0
  a0 -> b0 [color="blue"]
  test_multiple4 -> var_multiple4 [color="blue"]
  test_multiple100 -> var_multiple100 [color="blue"]
  test_multiple400 -> var_multiple400 [color="blue"]
  test_multiple4 -> end_no [label="non"; color="red"] 
}
  • Ma solution:
 #!/usr/bin/python3
 # -*- coding: utf-8 -*-
 # Variables
 annee:int
 var_multiple100:bool
 multiple4:bool
 var_multiple400:bool
 on:bool
 # Debut
 annee=int(input("Saisir une année\n"))
 multiple4 = annee % 4
 multiple400 = annee % 400
 multiple100 = annee % 100
 if multiple4==0 and multiple100!=0 or multiple400==0:
     print("Bisextile")
 else:
     print("Non Bisextile")
  • Correction:
 # Programme testant si une année, saisie par l'utilisateur,
 # est bissextile ou non
 annee = input("Saisissez une année : ") # On attend que l'utilisateur saisisse l'année qu'il désire tester
 annee = int(annee) # Risque d'erreur si l'utilisateur n'a pas saisi un nombre
 bissextile = False # On crée un booléen qui vaut vrai ou faux
                    # selon que l'année est bissextile ou non
 if annee % 400 == 0:
     bissextile = True
 elif annee % 100 == 0:
     bissextile = False
 elif annee % 4 == 0:
     bissextile = True
 else:
     bissextile = False
 if bissextile: # Si l'année est bissextile
     print("L'année saisie est bissextile.")
 else:
     print("L'année saisie n'est pas bissextile.")


La modularité

  • Créer un module qui sera appellé dans un programme principal.
    • multiply.py (Module)
 """module multiply contenant la fonction table"""
 def table(nb, max=10):
    """Fonction affichant la table de multiplication par nb de 1 * nb jusqu'à max * nb"""
    i = 0
    while i < max:
        print(i + 1, "*", nb, "=", (i + 1) * nb)
        i += 1
    • test.py (Programme principal)
 #!/usr/bin/python3
 # -*- coding: utf-8 -*-
 import os, time
 from multiply import table
 # test de la fonction table
 table(3, 20)
 #os.system("pause")
 time.sleep(10)
  • test.py
    • On envoie la valeur 3 dans nb de table
    • On envoie la valeur 20 dans max de table
      • si max n'a pas de valeur, il sera initialisé par défaut à 10
Lien: la modularite

Signature d'une fonction

  • On entend par « signature de fonction » les éléments qui permettent au langage d'identifier ladite fonction.
  • En Python comme vous avez pu le voir, on ne précise pas les types des paramètres.
  • La signature d'une fonction est tout simplement son nom.
  • On ne peut définir deux fonctions du même nom sinon l'ancienne définition est écrasée par la nouvelle.

L'instruction return

 def carre(valeur):
    return valeur * valeur
  • L'instruction return signifie qu'on va renvoyer la valeur, pour pouvoir la récupérer ensuite et la stocker dans une variable par exemple.
  • Cette instruction arrête le déroulement de la fonction, le code situé après le return ne s'exécutera pas.

Les fonctions lambda

  • mot-clé: lambda

exemple:

 >>> lambda x: x * x
 <function <lambda> at 0x00BA1B70>
 >>>

Appeler une fonction lambda

 >>> f = lambda x: x * x
 >>> f(5)
 25
 >>> f(-18)
 324
 >>>

Graphismes

TK1

# -*- coding: utf-8 -*-
# script bonjour.py
from tkinter import *
# Création de la fenêtre principale (main window)
Mafenetre = Tk()
# Création d'un widget Label (texte 'Bonjour tout le monde !')
Label1 = Label(Mafenetre, text = 'Bonjour tout le monde !', fg = 'red')
# Positionnement du widget avec la méthode pack()
Label1.pack()
# Création d'un widget Button (bouton Quitter)
Bouton1 = Button(Mafenetre, text = 'Quitter', command = Mafenetre.destroy)
Bouton1.pack()
# Lancement du gestionnaire d'événements
Mafenetre.mainloop()
Tk01.jpg




TK2

# script de.py
#(C) Fabrice Sincère
from tkinter import *
import random
def NouveauLance():
    nb = random.randint(1,6)
    Texte.set('Résultat -> ' + str(nb))
# Création de la fenêtre principale (main window)
Mafenetre = Tk()
Mafenetre.title('Dé à 6 faces')
Mafenetre.geometry('300x100+400+400')
# Création d'un widget Button (bouton Lancer)
BoutonLancer = Button(Mafenetre, text ='Lancer', command = NouveauLance)
# Positionnement du widget avec la méthode pack()
BoutonLancer.pack(side = LEFT, padx = 5, pady = 5)
# Création d'un widget Button (bouton Quitter)
BoutonQuitter = Button(Mafenetre, text ='Quitter', command = Mafenetre.destroy)
BoutonQuitter.pack(side = LEFT, padx = 5, pady = 5)
Texte = StringVar()
NouveauLance()
# Création d'un widget Label (texte 'Résultat -> x')
LabelResultat = Label(Mafenetre, textvariable = Texte, fg ='red', bg ='white')
LabelResultat.pack(side = LEFT, padx = 5, pady = 5)
Mafenetre.mainloop()
Tk02.jpg






TK3

 1 # script frames.py
 2 #(C) Fabrice Sincère
 3 from tkinter import *
 4 # Création de la fenêtre principale
 5 Mafenetre = Tk()
 6 Mafenetre.title('Frame widget')
 7 Mafenetre['bg']='bisque' # couleur de fond
 8 # création d'un widget Frame dans la fenêtre principale
 9 Frame1 = Frame(Mafenetre,borderwidth=2,relief=GROOVE)
10 Frame1.pack(side=LEFT,padx=10,pady=10)
11 # création d'un second widget Frame dans la fenêtre principale
12 Frame2 = Frame(Mafenetre,borderwidth=2,relief=GROOVE)
13 Frame2.pack(side=LEFT,padx=10,pady=10)
14 # création d'un widget Frame... dans un widget Frame
15 # le widget Frame1 est le parent du widget Frame3
16 # le parent du widget Frame1 est le widget Mafenetre (fenêtre principale)
17 Frame3 = Frame(Frame1,bg="white",borderwidth=2,relief=GROOVE)
18 Frame3.pack(side=LEFT,padx=10,pady=10)
19 # création d'un widget Label et d'un widget Button dans un widget Frame
20 Label(Frame1,text="RDV dentiste samedi à 15h").pack(padx=10,pady=10)
21 Button(Frame1,text="Effacer",fg='navy',command=Frame1.destroy).pack(padx=10,pady=10)
22 Label(Frame2,text="Réviser le contrôle d'info").pack(padx=10,pady=10)
23 Button(Frame2,text="Effacer",fg='navy',command=Frame2.destroy).pack(padx=10,pady=10)
24 Label(Frame3,text="RDV dentiste à 10h",bg="white").pack(padx=10,pady=10)
25 Button(Frame3,text="Effacer",fg='navy',command=Frame3.destroy).pack(padx=10,pady=10)
26 Mafenetre.mainloop()
Tk03.jpg








TK4

# script mot_de_passe.py
#(C) Fabrice Sincère
from tkinter import *
from tkinter.messagebox import * # boîte de dialogue
def Verification():
    if Motdepasse.get() == 'python27':
        # le mot de passe est bon : on affiche une boîte de dialogue puis on ferme la fenêtre
        showinfo('Résultat','Mot de passe correct.\nAu revoir !')
        Mafenetre.destroy()
    else:
        # le mot de passe est incorrect : on affiche une boîte de dialogue
        showwarning('Résultat','Mot de passe incorrect.\nVeuillez recommencer !')
        Motdepasse.set('')
# Création de la fenêtre principale (main window)
Mafenetre = Tk()
Mafenetre.title('Identification requise')
# Création d'un widget Label (texte 'Mot de passe')
Label1 = Label(Mafenetre, text = 'Mot de passe ')
Label1.pack(side = LEFT, padx = 5, pady = 5)
# Création d'un widget Entry (champ de saisie)
Motdepasse= StringVar()
Champ = Entry(Mafenetre, textvariable= Motdepasse, show='*', bg ='bisque', fg='maroon')
Champ.focus_set()
Champ.pack(side = LEFT, padx = 5, pady = 5)
# Création d'un widget Button (bouton Valider)
Bouton = Button(Mafenetre, text ='Valider', command = Verification)
Bouton.pack(side = LEFT, padx = 5, pady = 5)
Mafenetre.mainloop()
Tk04.jpg












TK5

# script spinbox.py
#(C) Fabrice Sincère
from tkinter import *
def carre():
    """ Calcul du carré """
    Resultat.set("Carré = "+str(float(Valeur.get())**2))
# Création de la fenêtre principale (main window)
Mafenetre = Tk()
Mafenetre.title("Spinbox widget")
Valeur = StringVar()
Valeur.set(2.0)
# Création d'un widget Spinbox
boite = Spinbox(Mafenetre,from_=0,to=10,increment=0.5,textvariable=Valeur,width=5,command=carre)
boite.pack(padx=30,pady=10)
# Création d'un widget Label
Resultat = StringVar()
carre()
Label(Mafenetre,textvariable=Resultat).pack(padx=30,pady=10)
Mafenetre.mainloop()
Tk05.jpg








TK6

# script scale.py
#(C) Fabrice Sincère
from tkinter import *
def maj(nouvelleValeur):
    # nouvelle valeur en argument
    print(nouvelleValeur)
def plus():
    Valeur.set(str(int(Valeur.get())+10))
    print(Valeur.get())
def moins():
    Valeur.set(str(int(Valeur.get())-10))
    print(Valeur.get())
# Création de la fenêtre principale (main window)
Mafenetre = Tk()
Mafenetre.title("Scale widget")
Valeur = StringVar()
Valeur.set(50)
# Création d'un widget Scale
echelle = Scale(Mafenetre,from_=-100,to=100,resolution=10,orient=HORIZONTAL,length=300,width=20,label="Offset",tickinterval=20,variable=Valeur,command=maj)
echelle.pack(padx=10,pady=10)
# Création d'un widget Button (bouton +)
Button(Mafenetre,text="+",command=plus).pack(padx=10,pady=10)
# Création d'un widget Button (bouton -)
Button(Mafenetre,text="-",command=moins).pack(padx=10,pady=10)
Mafenetre.mainloop()
Tk06.jpg
















TK7

# script cercle.py
#(C) Fabrice Sincère
from tkinter import *
import random
def Cercle():
    """ Dessine un cercle de centre (x,y) et de rayon r """
    x = random.randint(0,Largeur)
    y = random.randint(0,Hauteur)
    r = 20
    Canevas.create_oval(x-r, y-r, x+r, y+r, outline='blue', fill='blue')
def Effacer():
    """ Efface la zone graphique """
    Canevas.delete(ALL)
# Création de la fenêtre principale (main window)
Mafenetre = Tk()
Mafenetre.title('Cercle')
# Création d'un widget Canvas (zone graphique)
Largeur = 480
Hauteur = 320
Canevas = Canvas(Mafenetre, width = Largeur, height =Hauteur, bg ='white')
Canevas.pack(padx =5, pady =5)
# Création d'un widget Button (bouton Go)
BoutonGo = Button(Mafenetre, text ='Go', command = Cercle)
BoutonGo.pack(side = LEFT, padx = 10, pady = 10)
# Création d'un widget Button (bouton Effacer)
BoutonEffacer = Button(Mafenetre, text ='Effacer', command = Effacer)
BoutonEffacer.pack(side = LEFT, padx = 5, pady = 5)
# Création d'un widget Button (bouton Quitter)
BoutonQuitter = Button(Mafenetre, text ='Quitter', command = Mafenetre.destroy)
BoutonQuitter.pack(side = LEFT, padx = 5, pady = 5)
Mafenetre.mainloop()
Tk07.jpg






















TK8

# script cible.py
#(C) Fabrice Sincère
from tkinter import *
import random
def Cercle():
    """ Dessine un cercle de centre (x,y) et de rayon r """
    x = random.randint(0,Largeur)
    y = random.randint(0,Hauteur)
    r = 10
    # on dessine un cercle dans la zone graphique
    item = Canevas.create_oval(x-r, y-r, x+r, y+r, outline='black', fill='black')
    print("Création du cercle (item" , item ,")")
    # affichage de tous les items de Canevas
    print(Canevas.find_all())
def Undo():
    """ Efface le dernier cercle"""
    if len(Canevas.find_all()) > 1:
        item = Canevas.find_all()[-1]
        # on efface le cercle
        Canevas.delete(item)
        print("Suppression du cercle (item" , item ,")")
        # affichage de tous les items de Canevas
        print(Canevas.find_all())
def EffacerTout():
    """ Efface tous les cercles"""
    while len(Canevas.find_all()) > 1:
        Undo()
# Création de la fenêtre principale (main window)
Mafenetre = Tk()
Mafenetre.title('Cible')
# Image de fond
photo = PhotoImage(file="tk_cible.gif")
# Création d'un widget Canvas (zone graphique)
Largeur = 550
Hauteur = 550
Canevas = Canvas(Mafenetre,width = Largeur, height =Hauteur)
item = Canevas.create_image(0,0,anchor=NW, image=photo)
print("Image de fond (item",item,")")
Canevas.pack()
# Création d'un widget Button
BoutonGo = Button(Mafenetre, text ='Tirer', command = Cercle)
BoutonGo.pack(side = LEFT, padx = 10, pady = 10)
# Création d'un widget Button
BoutonEffacer = Button(Mafenetre, text ='Effacer le dernier tir', command = Undo)
BoutonEffacer.pack(side = LEFT, padx = 10, pady = 10)
# Création d'un widget Button
BoutonEffacerTout = Button(Mafenetre, text ='Effacer tout', command = EffacerTout)
BoutonEffacerTout.pack(side = LEFT, padx = 10, pady = 10)
# Création d'un widget Button (bouton Quitter)
BoutonQuitter = Button(Mafenetre, text ='Quitter', command = Mafenetre.destroy)
BoutonQuitter.pack(side = LEFT, padx = 10, pady = 10)
Mafenetre.mainloop()
Tk08.jpg




Sauvegarde

  • Je travaille sur un système Linux, je réinstalle quelques fois mon système.
  • J'ai besoin pour cela de créer une sauvegarde.

Cahier des charges

  • En utilisant au maximum Python, et de façon sécurisée.
  • voici les différentes parties à sauvegarder sur un autre support:
    • /etc
    • /var
    • /home
    • /root
  • Établir la liste de tous les programmes installés pour les réinstaller.
  • Sauvegarder les crontab.

Shell / Python

  • J'ai créé au cours de toutes ces années Linux, plusieurs centaines de scripts shell, des plus rudimentaires aux plus complexes.
  • Un bon exercice sera de les retranscrire tous en Python.
  • Je commencerai par les plus simples, il y a du travail.....

Gestion Système

Intro

  • Le module os est une bibliothèque dédié aux besoins de gestion de fichiers et de dossiers.
  • Pour python un chemin (ou path ), c'est une chaine de caractères, il existe donc des méthodes pour la manipuler:
>>> import os.path
>>> help(os.path)
abspath(path)             →   Retourne un chemin absolu
basename(p)               →   Retourne le dernier élément d'un chemin
commonprefix(list)        →   Retourne le chemin commun le plus long d'une liste de chemins
dirname(p)                →   Retourne le dossier parent de l'élément
exists(path)              →   Test si un chemin existe
getaTime(filename)        →   Retourne la date du dernier accès au fichier [os.stat()]
getctime(filename)        →   Retourne la date du dernier changement de métadonnées du fichier
getmTime(filename)        →   Retourne la date de la dernière modification du fichier
getsize(filename)         →   Retourne la taille d'un fichier (en octets) 
isabs(s)                  →   Test si un chemin est absolu
isdir(s)                  →   Test si le chemin est un dossier
isfile(path)              →   Test si le chemin est un fichier régulier
islink(path)              →   Test si le chemin est un lien symbolique
ismount(path)             →   Test si le chemin est un point de montage
join(path, s)             →   Ajoute un élément au chemin passé en paramètre
normcase(s)               →   Normalise la casse d'un chemin
normpath(path)            →   Normalise le chemin, élimine les doubles barres obliques, etc.
realpath(filename)        →   Retourne le chemin canonique du nom de fichier spécifié (élimine les liens symboliques)
samefile(f1, f2)          →   Test si deux chemins font référence au même fichier réel
sameopenfile(f1, f2)      →   Test si deux objets de fichiers ouverts font référence au même fichier
split(p)                  →   Fractionne un chemin d'accès. Retourne un tuple
>>> import os
>>> path = "/home/olivier/scripts/cgi-bin/action.py"
>>> os.path.dirname(path)
'/home/olivier/scripts/cgi-bin'
>>> os.path.basename(path)
'action.py'
>>> os.path.join(path, "func")
'/home/olivier/scripts/cgi-bin/action.py/func'
>>> os.path.split(path)
('/home/olivier/scripts/cgi-bin', 'action.py')
>>> os.path.abspath(".")
'/home/olivier'

Fichiers

  • Commande Linux: ls -rtl
Linux Python
Nom: rtl Nom: rtl.py
#!/bin/sh #!/usr/bin/python3.8
ls -rtl --color import os
os.system('ls -rtl --color')