Professional Documents
Culture Documents
Cette FAQ a été réalisée à partir des questions posées sur le forum Python complétées
par d'autres questions qui pouvaient nous sembler intéressantes de traiter. Toutefois
il se peut que les réponses apportées contiennent des erreurs, imprécisions ... Vous
pouvez dans ce cas contacter un des membres de la rédaction pour lui faire part de
vos remarques.
L'équipe Python de Developpez.
Ont contribué à cette FAQ :
-3-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
-4-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Vous pouvez les télécharger à partir de notre rubrique Outils Python et avoir plus de détails sur leur fonctionnement.
-5-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Si vous débutez en Python, téléchargez de préférence CPython. Toute la documentation du site ainsi que le forum sont
consacrés presque exclusivement à cette implémentation.
-6-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
^
IndentationError: unindent does not match any outer indentation level
>>> if nb > 0:
print "positif"
else: print "négatif"
positif
>>> if nb > 0:
print "positif"
else: print "négatif"
positif
-7-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Quelques exemples
## code pour obtenir des informations sur les string:
dir(str)
help(str)
str.__doc__
-8-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Quelques exemples
help(math.cos) ## ou help("math.cos")
math.cos.__doc__
Comment obtenir des informations sur son système (d'exploitation, plateforme, python) ?
Auteurs : Guigui_ ,
Python propose 2 modules principaux pour obtenir un maximum d'informations sur le système sur lequel est installé
Python et sur Python lui-même, ce qui peut-être utile nécessaire si on développe une application multi-plateforme ou
devant être compatible avec différentes versions de Python. Ces 2 modules sont sys et platform. Il vous suffira
de parcourir les différents liens pour découvrir toutes les fonctions disponibles.
Par exemple, pour connaître le système d'exploitation, vous pouvez faire:
msiexec /i python<version>.msi /q
où python<version>.msi correspond au fichier à installer , msiexec est le l'installateur de microsoft (fichier msiexec.exe
qui doit se trouver dans <Windows>\System32\ si non reconnu)
-9-
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Pour une installation pour tous les utilisateurs, il est nécessaire de spécifier un autre paramètres ALLUSERS=1.
En résumé, pour faire une installation sans interaction de l'utilisateur mais avec affichage complet du processus
d'installation, il suffit d'utiliser la commander suivante
D'autres paramètres peuvent être utiliser. Pour plus d'information, vous pouvez consulter la documentation
officielle
import Tkinter
root=Tkinter.Tk()
import Tkinter as Tk
root=Tk.Tk()
from Tkinter import *
root=Tk()
On utilise régulièrement un alias lorsque le nom du module est long (genre Tk pour Tkinter). Pour les modules courts
(os, re), on se contente d'un import simple.
On déconseille l'utilisation de l'instruction from même si le programme est plus concis. Le code sera moins lisible car
on ne saura pas à priori d'où viennent les fonctions utilisées. De plus, cela pourra entraîner des conflits de noms.
f=open('test.txt', 'w') ## la fonction open est celle des objets prédéfinies de Python
- 10 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
from os import *
f=open('test.txt',
O_CREAT) ## la fonction open est celle du module os, la définition de la fonction open du __builtin__ a été
## écrasée par celle de l'os lors lors de son import
import sys
sys.path.append(monchemin)
Depuis Python 2.5, il est également possible d'effectuer des importations relatives. Pour cela, il vous faut d'abord créer
un fichier __init__.py dans le répertoire contenant les modules à importer. Ce fichier peut être vide. Par exemple,
considérons un répertoire locale qui contient un répertoire A lui même contenant un fichier __init__.py vide et un fichier
testA.py. Depuis votre répertoire locale, vous pouvez importer testA par l'instruction import A.testA, from A import testA
ou from A.testA import *.
lien : What's New in Python: 4 PEP 328: Absolute and Relative Imports
- 11 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
>>> globals()['mavariable']=5
>>> mavariable
5
Dans le cas d'une classe, pour créer de nouveaux attributs, on peut utiliser l'appel au dictionnaire __dict__
Une autre façon, est d'utiliser la méthode global setattr(obj, name, value) qui aura le même effet
Une autre méthode est d'utiliser directement la fonction exec(unstr) qui exécute la chaîne de caractères passé en
argument
>>> exec('mavariable=5')
>>> mavariable
5
>>> exec("mavariable=['5','6']")
>>> mavariable
['5', '6']
Dans le cas d'une fonction: il n'est pas possible d'utiliser directement l'ajout d'un élément en passant directement par
le dictionnaire. Il faudra passer par la méthode exec
- 12 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
sys:1: DeprecationWarning: Non-ASCII character ... in file ... on line ..., but no encoding
declared;
see http://www.python.org/peps/pep-0263.html for details
Par défaut l'interpréteur s'attend à ne devoir traiter que des caractères ascii. L'encodage ascii ne contient que 256
caractères, n'incluant pas les caractères accentués et spéciaux du français. Pour que l'interpréteur reconnaisse les
caractères non ascii, vous devez déclarer l'encodage que vous utilisez au début du fichier source. Pour le français, les
encodages iso-8859-1, Latin-1, cp1252 ainsi que utf-8 fonctionneront.
La déclaration se fait comme ceci:
import sys
sys.exit()
- 13 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Toutes ses fonctions sont obtenues à partir du module os ou subprocess. Tout d'abord, vous pouvez utilisez la fonction
os.startfile( path[, operation]) qui exécute le fichier path avec l'application associée par défaut et rend immédiatement
la main.
import os
os.startfile('c:/windows/notepad.exe')
os.startfile('MonImage.bmp')
Une deuxième méthode est la fonction os.system( command) qui exécute command, ne rend la main que lorsque
l'application lancée prend fin. Vous pouvez lancer l'application externe avec des paramètres.
import os
os.system("c:/windows/notepad.exe monfichier.log")
os.system('MonImage.bmp')
Une troisième méthode est la fonction os.spawnl(...) ou os.spawnv(...) ainsi que leurs variantes qui permet d'exécuter un
programme dans un nouveau processus. Le premier paramètre attendu peut prendre comme valeur os.P_WAIT pour
attendre la fermeture de l'application avant de poursuivre le programme principal ou os.P_NOWAIT pour rendre la
main immédiatement.
import os
os.spawnl(os.P_NOWAIT, "c:/windows/notepad.exe")
Une quatrième méthode est la fonction os.popen( command[, mode[, bufsize]]) qui exécute command dans un processus
enfant et rend immédiatement la main en retournant un descripteur du fichier.
import os
os.popen("c:/windows/notepad.exe monfichier.log")
Vous pouvez également regarder du côté du module subprocess ( Python Library Reference: Subprocess
management ) qui aura pour but de remplacer les 3 dernières méthodes.
- 14 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
#!/usr/bin/python
# -*- coding: iso-8859-1 -*-
try:
Server()
except:
print 'Déjà en service !'
sys.exit()
print 'START'
time.sleep(10)
print 'STOP'
- 15 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
.
# Si vous êtes sous Windows et que vous voulez exécuter un programme test.py, vous pouvez procéder de la manière
suivante:
créer un fichier test.bat (qui n'est autre qu'un fichier texte renommée avec l'extension bat) dans lequel vous tapez:
c:/python24/python.exe test.py
pause
ou si le programme python.exe est le programme par défaut pour l'exécution d'un fichier .py
test.py
pause
import os
os.system('clear')
Sous Windows:
import os
- 16 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
os.system('cls')
import sys
print "un texte sur la 1er ligne",
print "un autre texte toujours sur la 1er ligne"
sys.stdout.write("on est sur la 2ème ligne")
print "on est toujours sur la 2ème ligne",
sys.stdout.write("on est sur toujours sur la 2ème ligne\n")
print "on est sur la 3ème ligne"
- 17 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
- 18 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Si base=0, la base est déterminée automatiquement en fonction de l'écriture du nombre sous forme de chaîne. Par
exemple, un nombre hexadécimale est écrit sous forme d'une chaîne commençant par 0x, un nombre octale sous forme
d'une chaîne commençant par 0. Dans ces cas-là, on n'est pas obligé de spécifier la base de départ en lui donnant la
valeur 0.
>>> int('0x15',0)
21
>>> int('071', 0)
57
>>> oct(21)
'025'
Pour convertir un nombre entier (ou en base 10) en un nombre hexadécimal, on utilise la fonction hex(N)
>>> hex(21)
'0x15'
A partir de la version 2.6 de Python, pour convertir un nombre entier (ou en base 10) en un nombre binaire, on utilise
la fonction bin(N)
>>> bin(21)
'0b10101'
- 19 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Pour convertir dans d'autres bases, vous devrez programmer vos propres fonctions
def bin(n):
"""Convertit un nombre en binaire"""
q = -1
res = ''
while q != 0:
q = n // 2
r = n % 2
res = `r` + res
n = q
return res
>>> bin(109323)
'11010101100001011'
On peut accélérer le processus avec un code sur le même algorithme mais beaucoup plus concis (suppression de toutes
les variables intermédiaires); ce qui peut être utile si on a besoin de convertir beaucoup de nombres
def bin_optimise(n):
"""Convertit un nombre en binaire"""
if n == 0: return '0'
res = ''
while n != 0: n, res = n >> 1, `n & 1` + res
return res
import time
n = 1000000
a = time.clock()
for i in range(n): bin(i)
b = time.clock()
for i in range(n): bin_optimise(i)
c = time.clock()
print b-a, ',', c-b
A partir de la version 2.6 de Python, les nombres binaires font leur apparition et commence par 0b. Pour convertir un
nombre entier en binaire, il suffit alors de passer par la fonction bin
- 20 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
'0b111'
>>> ord("é")
233
>>> ord("a")
97
>>> ord(" ")
32
>>> ord(u'\u9000')
36864
Si vous voulez l'ensemble des codes ascii d'une chaîne de caractères, il suffit d'utiliser la fonction map( ord, machaîne)
ou bien d'utiliser une liste en intention.
la méthode inverse est unichr(i) pour obtenir le caractère unicode de i ou chr(i) pour obtenir le caractère ascii de i. Dans
ce dernier ça, i doit être compris entre 0 et 255, une erreur est retournée sinon.
>>> unichr(63000)
u'\uf618'
>>> unichr(97)
u'a'
>>> chr(97)
'a'
- 21 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
- 22 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Sommaire > Type de données > Les chaînes de caractères > String
Où trouver de l'aide ?
Auteurs : Guigui_ ,
un grand nombre de fonctions sur les strings accessibles directement sur les chaines de caractères sans importation
de nouveau module: string. Ainsi, vous pourrez trouver une explication complète (avec l'utilisation des paramètres
optionels) aux différentes fonctions présentées par la suite.
>>> x = "0123456789"
>>> x[3:5]
'34'
>>> x[::2]
'02468'
>>> x[1::2]
'13579'
>>> x[:3]
'012'
>>> x[-3:]
'789'
>>>'tapadaca'.replace('a','i',2)
'tipidaca'
- 23 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
>>>'a = b'.split('=')
['a ',' b']
>>>'a b c d'.split()
['a', 'b', 'c', 'd']
>>> 'aaaaabbbbbaaaaa'.strip('aaa')
'bbbbb'
>>> ' a '.rstrip()
' a'
>>> 'tapadaca'.count('a')
4
>>> mystr='abcde'
>>> mystr[::-1]
- 24 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
'edcba'
>>> a = "c:\python25\tcl\reg1.1\tclreg11.dll"
>>> a
'c:\\python25\tcl\reg1.1\tclreg11.dll'
>>> print a
c:\python25 cl
eg1.1 clreg11.dll
>>> a = r"c:\python25\tcl\reg1.1\tclreg11.dll"
>>> a
'c:\\python25\\tcl\\reg1.1\\tclreg11.dll'
>>> print a
c:\python25\tcl\reg1.1\tclreg11.dll
lien : Pourquoi j'obtiens une erreur lorsque mon string contient le caractère \ (backslash) ?
Pourquoi j'obtiens une erreur lorsque mon string contient le caractère \ (backslash) ?
Auteurs : Guigui_ ,
Le caractère \ (backslash) est en Python un caractère spécial qui peut donner un sens spécial au caractère le succédant.
Par exemple, '\t' est le caractère de tabulation. Vous trouverez la liste des caractères spéciaux dans le Python
Reference Manual.
Ainsi, lorsque vous travaillez avec des chaînes de caractères, si celle-ci contient un \, une erreur ou une mauvaise
interprétation de la chaîne peut apparaître, notamment lorsque vous manipulez sous windows des path de fichiers ou
répertoires.
Si vous avez besoin du caractère \ dans une de vos chaînes, dédoublez-le (\\) ou bien utilisez les raw string qui ne
considèrent pas le caractère \ comme spécial.
Dans le cas de fichiers ou répertoires sous windows, on peut aussi utiliser le caractère / (slash) à la place qui est reconnu
de la même façon.
>>> import os
>>> os.path.isdir('c:\python24\bin')
False
>>> os.path.isdir('c:\\python24\\bin')
True
>>> os.path.isdir(r'c:\python24\bin')
True
>>> os.path.isdir('c:/python24/bin')
- 25 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
True
La fonction s.ljust( width[, fillchar]) permet d'ajuster une chaîne de caractères en ajoutant à droite le nombre de
caractères fillchar nécessaires pour que la nouvelle chaîne de caractères ait une longueur égale à width
- 26 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Sommaire > Type de données > Les chaînes de caractères > Les chaînes Unicode
Quel est la différence entre une chaîne unicode et une chaîne normale ?
Auteurs : Guigui_ ,
Les chaînes normales décrites par le type str sont des chaînes d'octets qui peuvent être interprétées en connaissant leur
encodage. Ils en existent de nombreux comme l'ascii (7 bits) qui est l'encodage par défaut de Python, ISO-8859-1 (ou
latin_1 sur 8 bits) pour les langues occidentales, utf-8, utf-16, ...
Les chaînes unicode décrites par le type unicode permette de définir tout caractère existant où chaque caractère
nécessite plusieurs octets pour être codées (2 octets pour Python qui utilise unicode UCS2). Les chaînes unicode sont
reconnaissables par la présence du caractère u devant la chaîne.
Vous pouvez transformer une chaîne normale en chaîne unicode et vice versa.
a = u'a\xe2'
print isinstance(a, unicode) ## True
strutf8 = '\xc3\xa2\xc3\xa4\xc3\xa0\xc3\xa9\xc3\xa8\xc3\xab\xc3\xaa'
## chaîne "âäàéèëê" encodée en utf-8
uni = unicode(strutf8, 'utf-8') ## uni = u'\xe2\xe4\xe0\xe9\xe8\xeb\xea'
uni2 = strutf8.decode('utf-8') ## uni2 = u'\xe2\xe4\xe0\xe9\xe8\xeb\xea'
Si vous utilisiez un autre encodage, vous pourriez obtenir une erreur (unicode(strutf8, 'ascii') génèrera une erreur) ou
bien une chaîne unicode ne décrivant par la chaîne spécifiée (unicode(strutf8, 'latin_1') ). Si vous voulez convertir une
chaîne de caractères non contenue dans une variable en chaîne unicode, vous pouvez directement le faire en rajoutant
en ajoutant le caractère u devant la chaîne
- 27 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
a = u'\xe2\xe4\xe0\xe9\xe8\xeb\xea'
a.encode('utf-8') ## '\xc3\xa2\xc3\xa4\xc3\xa0\xc3\xa9\xc3\xa8\xc3\xab\xc3\xaa'
import sys
print sys.stdin.encoding ## cp1252 sous IDLE, cp850 sous la console Python
machaine = 'äâ' ## machaine est une chaîne encodée selon l'encodage sys.stdin.encoding
unicode(machaine, sys.stdin.encoding) ## u'\xe4\xe2'
Ainsi la fenêtre interactive d'IDLE utilise l'encodage cp1252, la console interactive Python l'encodage cp850
- 28 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Sommaire > Type de données > Les chaînes de caractères > Expressions régulières
Comment tester la validité de son expression régulière ?
Auteurs : Miksimus ,
Le logiciel Kodos permet de tester vos expressions régulières. Il est disponible sous Linux et Windows. Son utilisation
est très simple et les quelques exemples disponibles vous permettront de comprendre rapidement son fonctionnement.
>>> import re
>>> a = "Phrase test avec des nombres comme 500 ou 2487"
>>> re.sub("\d", "*", a)
'Phrase test avec des nombres comme *** ou ****'
>>> re.sub("\d+", "*", a)
'Phrase test avec des nombres comme * ou *'
- 29 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
>>> a = [5, 0, 3, 9, 4, 3, 7]
>>> a.append(15) ## a = [5, 0, 3, 9, 4, 3, 7, 15]
>>> a.extend((45, 12, 35)) ## a = [5, 0, 3, 9, 4, 3, 7, 15, 45, 12, 35]
>>> a.extend('abcdef') ## a = [5, 0, 3, 9, 4, 3, 7 ,15, 45, 12 ,35, 'a', 'b', 'c', 'd', 'e', 'f']
>>> a.count(3)
2
>>> a.index(3)
2
>>> a.insert(8, 6) ## a = [5, 0, 3, 9, 4, 3, 7 ,15, 6, 45, 12 ,35, 'a', 'b', 'c', 'd', 'e', 'f']
>>> a.pop() ## a = [5, 0, 3, 9, 4, 3, 7 ,15, 6, 45, 12 ,35, 'a', 'b', 'c', 'd', 'e']
'f'
>>> a.remove(3) ## a = [5, 0, 9, 4, 3, 7 ,15, 6, 45, 12 ,35, 'a', 'b', 'c', 'd', 'e']
>>> a.reverse() ## a = ['e', 'd', 'c', 'b', 'a', 35, 12, 6, 45, 7, 3, 4, 9, 0, 5]
>>> a.sort() ## a = [0, 3, 4, 5, 6, 7, 9, 12, 35, 45, 'a', 'b', 'c', 'd', 'e']
l = [1,5,4,1,23,1,2,1]
try:
while True: l.remove(1)
except: pass
print l ## [5,4,23,2]
Si vous voulez supprimer toutes les occurences d'une valeur dans une liste, ne passer pas par la méthode remove qui
est lente mais reconstruisez plutôt entièrement votre liste en omettant les éléments qui ne vous intéressent plus. Cela
se fait très facilement avec une liste en intension.
- 30 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Pour ne conserver qu'une seule occurence pour chaque élement de la liste, utilisez le type set qui représente les objets
ensembles et qui conserve donc une unique occurence de chaque élément d'une séquence.
l = [1,5,4,1,23,1,2,1]
s = set(l)
l = list(s)
print l ## [1,2,4,5,23]
Niveau algorithmique, voici une méthode pour mélanger une liste d'une complexité linéaire (par rapport au nombre
d'éléments de la liste). On va simplement parcourir tous les élements de la liste et à chaque fois en choisir un autre au
hasard et faire l'échange des 2 éléments. Cette méthode sera de toute façon beaucoup plus longue que l'utilisation de
la fonction précédente.
import random
l = range(1000)
count = len(l)
randint = random.randint
for i in range(count):
j = randint(0,count-1) ## Selection au hasard de l'index d'un element de la liste
## Echange des 2 elements
- 31 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
del(mylist[:])
une autre méthode beaucoup moins rapide est d'utiliser la méthode pop dans une boucle while
>>> l = 5 * [5*[0]]
>>> l[0][0] = 1
>>> print l
[[1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0]]
Cependant en tenant de modifier un élément de la liste, on s'aperçoit que l'affectation s'est faite à plusieurs endroits.
Ceci vient simplement du fait que lors de la création de notre liste de listes, la sous-liste 5*[0] n'a en fait été créée qu'une
seule fois et que chaque sous-liste l[i] (0<=i<=4) pointe ainsi sur la même zone mémoire.
Pour créer une liste de listes (contenant des éléments initialisés), il vous faudra donc passer par 2 étapes:
>>> l = 5*[0] ## peu importe ce que l'on met dans cette liste
>>> for i in range(len(l)): l[i] = 5*[0]
>>> l[0][0]=1
>>> print l
[[1, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
Il est à noter que cette méthode ne fonctionne qu'avec des types ou objets immuables (nombres ou chaînes de caractères)
mais pas avec des objets.
- 32 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Attention: Avec Python 3.0, ces méthodes ne renvoient plus des listes mais des vues, pour obtenir une liste, il faut utiliser
list(dict.items()) par exemple
On peut aussi itérer sur les clés :
- 33 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
• Tous les types immuables de python (numériques, chaînes de caractères, tuples, etc. mais pas les listes ni les
dictionnaires !)
• Tous les types disposant des méthodes __hash__ et __eq__ ou __cmp__
- 34 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
def fonctiontest(data):
if type(data) == int: _testint(data)
elif type(data) == str: _teststr(data)
elif type(data) == list: _testlist(data)
else: raise AttributeError, "aucun traitement pour le type "+str(type(data))
>>> fonctiontest(1)
traitement d'un entier 1
>>> fonctiontest("1")
traitement d'un string 1
>>> fonctiontest({})
AttributeError: aucun traitement pour le type <type 'dict'>
S'il s'agit d'une surcharge de fonctions dont le nombre de paramètres peut varier, on peut utiliser la syntaxe *args qui
permet de passer autant de paramètres supplémentaires par position que l'on veut
def somme(*args):
return sum(args)
S'il s'agit d'une surcharge de fonctions dont le nombre de paramètres peut varier ainsi que leur type (ou leur sens), on
peut dans ce cas utiliser soit un paramètre dictionnaire soit un paramètre de la forme **keys qui permet de passer des
paramètres par la syntaxe nomparametre = valeurparametre
def calcul(**keys):
score = keys['value']
if 'somme' in keys: score += keys['somme']
if 'produit' in keys: score *= keys['produit']
return score
- 35 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
On peut bien évidemment mélanger les différentes syntaxe. La syntaxe général étant def mafonction(param1, param2, ...,
*args, **keys): ...
import inspect
class TestInspect:
def MaFonction(self, p1, p2 = 'PPP2', p3 = 'PPP3', *arg , **kwarg ): pass
- 36 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
import marshal
import cPickle
dico = {}
dico['toto'] = [23,'53453',{'a':5}]
marshal.dump(dico, open("mondico", 'wb')) ## Sauvegarde du dictionnaire
print marshal.load(open("mondico", "rb")) ## Rechargement du dictionnaire
class toto:
def __init__(self):
self.x = 5
tutu = toto()
cPickle.dump(tutu, open("toto2", "wb")) ## Sauvegarde de l'objet tutu
print cPickle.load(open("toto2")).x ## Rechargement de l'objet tutu
Comment sauvegarder une instance Python contenant des images dans un fichier ?
Auteurs : Guigui_ ,
Vous pouvez avoir besoin de travailler sur des objets contenant directement le contenu d'images ou bien de transférer
des objets devant travailler sur des images. Vous devez tout d'abord récupérer et installer la bibliothèque Pil. Au
lieu de devoir ainsi fournir un fichier contenant l'objet et chacune des images dans des fichier séparés ou dans un
fichier .zip, vous pouvez alors décider d'utiliser un unique fichier qui peut ainsi faciliter la procédure. En revanche, si
vous travaillez avec des images compressées, le fichier que nous allons créer sera beaucoup plus gros que l'ensemble
des fichiers images le constituant.
Pour cela, il suffit tout d'abord d'ouvrir chaque image en tant fichier binaire grâce à la commande open et le paramètre
'rb' et de les conserver dans une variable ou un autre conteneur (comme une liste ou un dictionnaire).
la méthode seek(0) vous permet de vous placer au début du fichier et la méthode read() de lire le contenu entier du
fichier ouvert.
- 37 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Une fois que vous avez récupérer le fichier créé avec cPickle, vous pouvez récupérer en connaissant la structure du
fichier les 2 images transmises. Pour cela, on va utiliser le module cStringIO qui permet de lire et de créer des fichiers
en mémoire. Par la méthode write, nous allons écrire le contenu de nos variables, se repositionner avec seek(0) au début
du fichier. Enfin, nous allon récréer une image grâce à Pil et la fonction Image.open.
>>> a = 5
>>> a.__class__.__name__
'int'
>>> class toto: pass
>>> b = toto()
>>> b.__class__.__name__
'toto'
Construction d'une classe angle qui donne l'angle principale entre 0 et 360°
class angle(int):
def __new__(self, n):
## On retourne l'angle principale dans l'intervalle [0;360]
return int.__new__(self, n % 360)
def __sub__(self, n):
## On calcule la différence de 2 angles en retournant l'angle principal
return angle(super(angle, self).__sub__(n))
def __add__(self, n):
- 38 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Construction d'une classe angle qui donne l'angle principale entre 0 et 360°
## On calcule la somme de 2 angles en retournant l'angle principal
return angle(super(angle, self).__add__(n))
A = angle(540)
B = angle(- 460)
print A, B, type(A), type(B) ## 180 260 <class '__main__.angle'> <class '__main__.angle'>
print A - B, type(A - B) ## 280 <class '__main__.angle'>
print A + B, type(A - B) ## 80 <class '__main__.angle'>
class Vector:
def __init__(self, x=0, y=0):
self.x=x
self.y=y
def __eq__(self, vB): return (self.x==vB.x) and (self.y==vB.y)
## test l'égalité de 2 vecteurs
def __add__(self, vB): return Vector(self.x+vB.x,self.y+vB.y) ## retourne le vecteur somme
def __sub__(self, vB): return Vector(self.x-vB.x,self.y-vB.y) ## retourne le vecteur différence
def __mul__(self, c):
if isinstance(c,Vector): return self.x*c.x+self.y*c.y ## retourne le produit scalaire
else: return Vector(c*self.x,c*self.y) ## retourne le vecteur multiplé par un scalaire
def __div__(self, c): return Vector(self.x/c,
self.y/c) ## retourne le vecteur ayant subi une division scalaire
def __abs__(self): return math.hypot(self.x, self.y) ## retourne la norme2 du vecteur
>>> a = Vector(4,5)
>>> b = Vector(6,7)
>>> print a==b
False
>>> print a+b
(10,12)
>>> print a-b
(-2,-2)
>>> print a*b
59
>>> print abs(a)
6.40312423743
- 39 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
- 40 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
un grand nombre de fonctions sur les fichiers/répertoires sont proposées par les module os, module os.path et
module shutil
- 41 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
>>> import os
>>> os.listdir('c:/python24')
['DLLs', 'Doc', 'include', 'kinterbasdb-wininst.log', 'Lib', 'libs', 'LICENSE.txt', 'matplotlib-wininst.log',
'msvcp71.dll', 'msvcr71.dll', 'MySQL-python.exe-wininst.log', 'NEWS.txt', 'numarray-wininst.log',
'Numeric-wininst.log', 'PIL-wininst.log', 'psycopg-wininst.log', 'py.ico', 'pyc.ico', 'python.exe',
'python.exe.manifest', 'pythonw.exe', 'pythonw.exe.manifest', 'pywin32-wininst.log', 'README.txt',
'Removekinterbasdb.exe', 'Removematplotlib.exe', 'RemoveMySQL-python.exe.exe', 'Removenumarray.exe',
'RemoveNumeric.exe', 'RemovePIL.exe', 'Removepsycopg.exe', 'Removepywin32.exe', 'Scripts', 'share', 'tcl',
'Tools', 'w9xpopen.exe']
On peut également utiliser la fonction glob.glob(path) qui renvoie une liste contenant le chemin complet des fichiers ou
répertoire contenu dans path
- 42 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
La fonction os.walk(path) crée un générateur de triplets (root, dirs, files) dans l'arborescence de path. Un triplet est
généré par répertoire visité. root représente le chemin d'accès du répertoire visité. dirs est la liste des sous-répertoires
du répertoire root et files est la liste des fichiers du répertoire root.
def listdirectory2(path):
fichier=[]
for root, dirs, files in os.walk(path):
for i in files:
fichier.append(os.path.join(root, i))
return fichier
import time
def compare(path):
a = time.clock()
listdirectory(path)
b = time.clock()
listdirectory2(path)
c = time.clock()
return b-a, c-b
>>>print compare('c:/python24')
- 43 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Fonctions pour récupérer des les différentes parties d'un nom de fichier
• dirname(path): retourne le répertoire associé au path
• basename(path): retourne le nom simple du fichier (extension comprise)
• split(path): retourne le couple (répertoire, nom du fichier)
• splitdrive(path): retourne le couple (lecteur, chemin du fichier sans le lecteur)
- 44 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
- 45 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
import os.path
def sizedirectory(path):
size = 0
for root, dirs, files in os.walk(path):
- 46 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
print sizedirectory("c:/python25")
- 47 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
- 48 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Sommaire > Gestion Fichier/Répertoire > Fichiers de configuration > Fichiers variable=valeur
Quel est la structure d'un fichier variable=valeur ?
Auteurs : Guigui_ ,
La manière la plus simple de créer un fichier de configuration est la suivante: une suite de lignes "variable = valeur.
On permet d'utiliser des commentaires (##). Ceux si peuvent être soit placés en début de ligne soit après une ligne
variable=valeur.
## Commentaire
variable1 = value1 ## commentaire1
variable2 = value2 ## commentaire2
...
conf.txt
## Voici un exemple d'un fichier de configuration
variable1 = 10 ## un integer
variable2 = Guigui ## un string
Voici un exemple pour récupérer les variables/valeurs. Celles-ci sont introduit dans un dictionnaire. Libre à vous ensuite
de passer d'un dictionnaire à une liste de variables
On peut ensuite traiter le dictionnaire pour pouvoir accéder directement aux variables sans passer par le dictionnaire
- 49 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
[Section1]
NomDeClé1 : Valeur1
NomDeClé2 = Valeur2
[Section2]
NomDeClé3 : Valeur3
...
import ConfigParser
config = ConfigParser.ConfigParser()
config.add_section('Section String')
config.set('Section String', 'str1', 'MonString')
config.add_section('Section Integer')
config.set('Section String', 'int1', 100)
config.write(open('conf.cfg','w'))
- 50 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
config.read('conf.cfg')
monint = config.getint('Section Integer', 'int1')
monstring = config.get('Section String', 'str1')
- 51 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
zipdirectory('python25.zip', 'c:/python25')
import zipfile
import os.path
import os
import glob
- 52 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
dezip('python25.zip', 'python25')
- 53 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Le module _winreg permet d'accéder aux bases de registre sous Windows. Vous trouverez dans la Python Library
reference l'aide suffisante pour manipuler la base de registre.
import _winreg
key = _winreg.CreateKey(_winreg.HKEY_CURRENT_USER, 'Software\\MonProg')
import _winreg
_winreg.DeleteKey(_winreg.HKEY_CURRENT_USER, 'Software\\MonProg')
import _winreg
key = _winreg.OpenKey( _winreg.HKEY_CURRENT_USER, 'Software\\MonProg',0, _winreg.KEY_READ)
(valeur,typevaleur) = _winreg.QueryValueEx(key,'MaDonnee')
_winreg.CloseKey(key)
print valeur, typevaleur
- 54 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Pour modifier une valeur, on applique la fonction SetValueEx( key, value_name, reserved, type, value) sur la key
précédente où value_name représente le nom de la valeur, reserved peut être n'importe quoi (c'est toujours 0 qui est
transmis), type est un entier (dont les valeurs possibles sont données dans le tableau ci-dessous) représentant le type de
la donnée et value la valeur de la donnée en question.
import _winreg
key = _winreg.OpenKey( _winreg.HKEY_CURRENT_USER, 'Software\\MonProg',0, _winreg.KEY_SET_VALUE)
_winreg.SetValueEx(key, 'MaDonnee', 0, _winreg.REG_DWORD, 5)
_winreg.CloseKey(key)
Constante Description
REG_BINARY Donnée binaire de n'importe quel forme
REG_DWORD Un nombre sur 32 bits
REG_DWORD_LITTLE_ENDIAN Un nombre sur 32 bits au format little-
endian
REG_DWORD_BIG_ENDIAN Un nombre sur 32 bits au format big-endian
REG_EXPAND_SZ String référençant une variable
d'environnement
REG_LINK Un lien symbolique
REG_MULTI_SZ Une séquence de string
REG_NONE Type sans valeur définie
REG_RESOURCE_LIST Une liste de ressources
REG_SZ Un string
import _winreg
key = _winreg.OpenKey( _winreg.HKEY_CURRENT_USER, 'Software\\MonProg',0, _winreg.KEY_SET_VALUE)
_winreg.DeleteKey(key, 'MaDonnee')
_winreg.CloseKey(key)
- 55 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
• group doit rester à None, en attendant que la classe ThreadGroup soit implantée.
• target est la fonction appelée par le Thread.
• name est le nom du Thread.
• args est un tuple d'arguments pour l'invocation de la fonction target
• kwargs est un dictionnaire d'argumens pour l'invocation de la fonction target
import threading
import threading
import time
class Affiche(threading.Thread):
def __init__(self, nom = ''):
threading.Thread.__init__(self)
self.nom = nom
self.Terminated = False
def run(self):
i = 0
while not self.Terminated:
print self.nom, i
i += 1
time.sleep(2.0)
print "le thread "+self.nom +" s'est termine proprement"
def stop(self):
self.Terminated = True
- 56 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Le problème de la méthode précédente est donc le fait qu'il peut y avoir un laps de temps important entre le moment
de la demande de l'arrêt du thread et celui où le thread est réèllement terminé dû à la durée du timer. En utilisant la
classe Event, on peut ainsi accélérer l'arrêt du thread car la méthode monevent.wait(timeout) bloque le thread pendant
la durée timeout où jusqu'au moment où la méthode monevent.set() est appelée. La classe Affiche2 présente un exemple
sur ce principe.
class Affiche2(threading.Thread):
def __init__(self, nom = ''):
threading.Thread.__init__(self)
self.nom = nom
self._stopevent = threading.Event( )
def run(self):
i = 0
while not self._stopevent.isSet():
print self.nom, i
i += 1
self._stopevent.wait(2.0)
print "le thread "+self.nom +" s'est termine proprement"
def stop(self):
self._stopevent.set( )
a = Affiche('Thread A')
b = Affiche('Thread B')
c = Affiche2('Thread C')
a.start()
b.start()
c.start()
time.sleep(6.5)
a._Thread__stop()
b.stop()
c.stop()
import threading
import time
MyTimer(2.0)
L'exemple précédent très simple ne permet pas de stopper et de relancer le Timer à votre guise.
- 57 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Voici un exemple d'une classe gérant un Timer avec possibilité de l'arrêter et de le relancer. Ce Timer prend en
paramètre la période du Timer (tempo), la fonction à appeler (target) et les arguments à passer à la fonction (une liste args
et un dictionnaire kwargs). Vous pouvez alors lancer la fonction par la méthode start() et l'arrêter par la méthode stop()
class MyTimer:
def __init__(self, tempo, target, args= [], kwargs={}):
self._target = target
self._args = args
self._kwargs = kwargs
self._tempo = tempo
def _run(self):
self._timer = threading.Timer(self._tempo, self._run)
self._timer.start()
self._target(*self._args, **self._kwargs)
def start(self):
self._timer = threading.Timer(self._tempo, self._run)
self._timer.start()
def stop(self):
self._timer.cancel()
def affiche(unstr):
print unstr, time.clock()
Il existe d'autres implémentations de Timer, par exemple la bibliothèque wxPython fournit un objet wx.Timer
- 58 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
import webbrowser
webbrowser.open('http://python.org')
import urllib
page=urllib.urlopen('http://python.org')
strpage=page.read()
## On va ici simplement analyser un fichier xml disponible sur internet qui donne l'adresse IP
ipxml = xml.dom.minidom.parse(urllib.urlopen('http://www.showmyip.com/xml/'))
myIP = ipxml.getElementsByTagName('ip')[0].childNodes[0].nodeValue
print myIP
- 59 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Pour connaître l'adresse IP interne de votre ordinateur (si vous êtes derrière un routeur) ou l'IP externe (si vous
n'êtes pas derrière un routeur), vous pouvez récupérer très facilement récupérer cette information. Par la fonction
socket.gethostname(), vous récupérer le nom de votre ordinateur puis la fonction socket.getaddrinfo( host, port[, family[,
socktype[, proto[, flags]]]]) retourne une liste d'informations utiles pour la manipulation de socket dont on peut extraire
facilement l'adresse IP que l'on recherche.
import socket
info = socket.getaddrinfo(socket.gethostname(), None)
print info
- 60 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
import ftplib
class GDDFTP(ftplib.FTP):
def __init__(self, adresse, port, user, password):
ftplib.FTP.__init__(self, '')
self.adresse = adresse
self.port = port
self.user = user
self.password = password
def Reconnect(self):
self.connect(self.adresse, self.port) ## Recherche FTP
self.login(self.user, self.password) ## Connexion
def Command(self, command, *args):
try: return command(*args)
except:
self.Reconnect()
return command(*args)
try:
ftp.size(MyPath)
## Traitement si c'est un fichier
except:
## Traitement si c'est un répertoire
- 61 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
On peut aussi tenter d'accéder au dossier ftp.cwd( pathname) qui générera une erreur si pathname ne représente pas
un répertoire. Il faudra cependant penser à retourner dans le répertoire parent ensuite.
try:
ftp.cwd(MyPath)
ftp.cwd("..")
## Traitement si c'est un répertoire
except:
## Traitement si c'est un répertoire
import ftplib
ftp = ftplib.FTP('')
ftp.connect(monadresse, monport)
ftp.login(monlogin, monpassword)
ftp.storbinary('STOR fichiersurserveur', open(fichieratransferer, 'rb'))
import os
import ftplib
- 62 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
lenpathsrc = len(pathsrc)
def _download(pathsrc):
l = ftp.nlst(pathsrc)
for i in l:
try:
ftp.size(i)
print i
ftp.retrbinary('RETR '+i, open(pathdst+os.sep+i[lenpathsrc:], 'wb').write)
except:
try: os.makedirs(pathdst+os.sep+os.path.dirname(i[lenpathsrc:]))
except: pass
_download(i)
_download(pathsrc)
ftp = ftplib.FTP('')
ftp.connect(monadresse, monport)
ftp.login(monlogin, monpassword)
download(cheminsource, chemindestination)
- 63 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
>>> l = [5, 1, 4]
>>> l = l.sort() ## ici, on a en fait affecté None à l
>>> l.append(5)
>>> l = [5, 1, 4]
>>> l.sort() ## ici, on trie en place l
>>> l
- 64 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
[1, 4, 5]
lien : [Tkinter] Pourquoi j'obtiens le message AttributeError: 'NoneType' object has no attribute ... ?
lien : Comment importer un module qui n'est pas dans le répertoire courant ?
Pourquoi j'obtiens le message TypeError: unsupported operand type(s) for ...: ... and ... ?
Auteurs : Guigui_ ,
Ce message d'erreur intervient lorsque vous essayer d'effectuer entre 2 objets une opération qui n'est pas supportée.
Cela intervient souvent lorsque les objets sont de types différents. Python est un langage fortement typé, c'est à dire
qu'il ne modifiera jamais le type d'un objet sauf si une conversion est demandée explicitement.
Ainsi, si vous voulez concaténer un nombre et une chaîne de caractères, il vous faudra tout d'abord convertir le nombre
en chaîne.
>>> 5 + 'e'
- 65 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
- 66 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
- 67 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
- 68 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
•
Apprendre à programmer avec Python : chapitres 8, 13-15
•
Python Library Reference 2.6
•
Python Library Reference 3.0
•
An Introduction to Tkinter (1999) : documentation exhaustive de Tkinter
•
An Introduction to Tkinter (2005) : en cours de rédaction
- 69 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
import Tkinter as Tk
import tkMessageBox
import tkFileDialog
import Tix
root=Tk.Tk() ## Création de la fenêtre principale si vous n'utilisez que des objets Tkinter
root=Tix.Tk() ## Création de la fenêtre principale si vous utilisez des objets Tix
entry=Tk.Entry(root) ## Création d'un Entry
button=Tk.Button(root) ## Création d'un Button
label=Tk.Label(root) ## Création d'un Label
listbox=Tk.Listbox(root) ## Création d'une Listbox
canvas=Tk.Canvas(root) ## Création d'un Canvas
text=Tk.Text(root) ## Création d'un Text
- 70 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
- 71 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Sommaire > GUI > Tkinter / Tix / Pmw > Tkinter > Widget
Comment donner le focus à un Widget ?
Auteurs : Guigui_ ,
w.focus_set() donne le focus au widget w
La fonction font.config(**font_option) permet de configurer la fonte, les différents attributs étant optionnels.
import tkFont
fonte = tkFont.Font(root)
fonte.config(size=18, family='courier', slant=tkFont.ITALIC, weight=tkFont.BOLD, underline=True,
overstrike=True)
label.config(font = fonte)
def imgaffiche():
img = Tk.PhotoImage(file = imgfile)
## Création d'un objet PhotoImage qui reconnait les extensions .gif et .ppm
gifsdict[imgfile] = img ## si on commente cette ligne, l'image ne s'affichera pas
button.configure(image=img) ## Ajout de l'image sur le bouton
## On pourrait aussi directement faire
## gifsdict[imgfile] = Tk.PhotoImage(file = imgfile)
## button.configure(image = gifsdict[imgfile])
root = Tk.Tk()
button = Tk.Button(text = "affiche image", command = imgaffiche)
- 72 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
gifsdict={} ## Utilisation d'un dictionnaire pour conserver une référence sur la PhotoImage créée
button.pack()
root.mainloop()
Si vous voulez afficher une image autre que GIF ou PPM, il vous faudra passer par la bibliothèque PIL qui est
capable de lire tout type d'images. Il faudra également conserver l'image dans un objet conteneur Python pour les
mêmes raisons que précedemment.
from PIL import Image, ImageTk ## Importation des modules utiles dans PIL
import Tkinter as Tk
root = Tk.Tk()
root.mainloop()
import Tkinter as Tk
root = Tk.Tk()
root.config (bg = "red")
label = Tk.Label(root, text = "test")
label.configure(background = "#50A42D")
label.pack()
root.mainloop()
- 73 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Sommaire > GUI > Tkinter / Tix / Pmw > Tkinter > Fenêtre
Comment empêcher le redimensionnement d'une fenêtre par l'utilisateur ?
Auteurs : Guigui_ ,
root.resizable(width=False, height=False)
Remarque: en revanche, cela n'empêchera pas le redimensionnement automatique de votre fenêtre si vous utilisez le
gestionnaire de géométrie pack ou grid
import Tkinter as Tk
root = Tk.Tk()
lbl = Tk.Label(text=0)
def go():
for i in range(100000):
lbl.config(text=i)
root.update()
btn = Tk.Button(text='go', command=go)
lbl.pack()
btn.pack()
root.mainloop()
import Tkinter as Tk
root = Tk.Tk()
def Intercepte():
- 74 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
root.protocol("WM_DELETE_WINDOW", Intercepte)
root.mainloop()
import Tkinter as Tk
root = Tk.Tk()
root.title('Main root')
def createframe():
toplevel = Tk.Toplevel(root)
toplevel.title('Subroot')
import Tkinter as Tk
root = Tk.Tk()
root.iconbitmap("MyIcon.ico")
root.mainloop()
import Tkinter as Tk
root = Tk.Tk()
def affiche():
- 75 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
top=Tk.Toplevel()
top.overrideredirect(1)
btn = Tk.Button(top, text = 'Fermer', command = top.destroy)
btn.pack()
root.mainloop()
- 76 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Sommaire > GUI > Tkinter / Tix / Pmw > Tkinter > Entry
Comment effacer le contenu d'un Entry ?
Auteurs : Guigui_ ,
entry.delete(0,Tk.END)
Comment utiliser la zone de texte comme une zone de saisie de mot de passe ?
Auteurs : Guigui_ ,
entry.configure(show='*')
import Tkinter as Tk
root = Tk.Tk()
entry = Tk.Entry(root, state=Tk.DISABLED)
i=0
def EntryStateModify():
global i
- 77 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
entry.config(state=Tk.NORMAL)
entry.insert(Tk.END, str(i))
entry.config(state = Tk.DISABLED)
i += 1
entry.pack()
btn.pack()
root.mainloop()
- 78 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Sommaire > GUI > Tkinter / Tix / Pmw > Tkinter > Button
Comment associer une fonction au clic gauche sur un bouton ?
Auteurs : Guigui_ ,
Une première méthode est de renseigner l'attribut command du widget Tk.Button. Cet attribut est associé à une fonction
sans paramètre. Il est important de ne pas mentionner les void () lors de cette association.
On peut également utiliser la fonction bind, cf Comment associer un évènement clavier/souris à un widget ?.
import Tkinter as Tk
def clic():
print 'Clic gauche sur le bouton'
root = Tk.Tk()
button = Tk.Button(root, text = 'toto', command = clic)
button.pack()
root.mainloop()
f1 = lambda x: x + 5
print f1(9) ## 14
f2 = lambda x, y = 5: x * y
f2(6) ## 30
def multiplie(x, y): print x * y
f3 = lambda x, y:multiplie(x, y)
f3(7, 3) ## 21
Pour utiliser les expressions lambda avec un Button, les arguments devront obligatoirement avoir une valeur par défaut
vu que le clic sur un bouton ne peut apporter de valeurs aux paramètres de l'expression lambda. Si vous voulez pouvoir
modifier ces valeurs aux cours du programme il faudra soit utiliser des variables modifiables soit redéfinir le paramètre
command
import Tkinter as Tk
def AfficheLabel(txt):
label.config(text = txt)
root = Tk.Tk()
label = Tk.Label(root, text = "Clic sur le bouton ")
label.grid(row = 0, column = 0, columnspan = 3)
svEntry = Tk.StringVar()
edit = Tk.Entry(root, textvariable = svEntry)
- 79 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
edit.grid(row = 1, columnspan = 3)
btn1 = Tk.Button(root, text = "Button1", command = lambda
x=1:AfficheLabel("Clic sur le bouton "+str(x)))
btn2 = Tk.Button(root, text = "Button2", command = lambda
x=2:AfficheLabel("Clic sur le bouton "+str(x)))
btn3 = Tk.Button(root, text = "Button3", command = lambda
x=svEntry:AfficheLabel("valeur de l'entry: "+x.get()))
btn1.grid(row = 2, column = 0)
btn2.grid(row = 2, column = 1)
btn3.grid(row = 2, column = 2)
root.mainloop()
- 80 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Sommaire > GUI > Tkinter / Tix / Pmw > Tkinter > Label
Comment modifier le texte du label ?
Auteurs : Guigui_ ,
l.config(text=newstr) remplace le texte du label par newstr
- 81 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Sommaire > GUI > Tkinter / Tix / Pmw > Tkinter > Listbox
Comment récupérer un élément cliqué dans une Listbox ?
Auteurs : Guigui_ ,
def clic(evt):
i=listbox.curselection() ## Récupération de l'index de l'élément sélectionné
return listbox.get(i) ## On retourne l'élément (un string) sélectionné
listbox.bind('<ButtonRelease-1>',clic)
## on associe l'évènement "relachement du bouton gauche la souris" à la listbox
import Tkinter as Tk
root = Tk.Tk()
f1 = Tk.Frame(root)
s1 = Tk.Scrollbar(f1)
l1 = Tk.Listbox(f1)
for i in range(20): l1.insert(i, str(i))
s1.config(command = l1.yview)
l1.config(yscrollcommand = s1.set)
l1.pack(side = Tk.LEFT, fill = Tk.Y)
s1.pack(side = Tk.RIGHT, fill = Tk.Y)
f1.pack()
root.mainloop()
root = Tk.Tk()
listbox = Tk.Listbox(root)
listbox.insert(0, 'element1')
- 82 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
- 83 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Sommaire > GUI > Tkinter / Tix / Pmw > Tkinter > Canvas
Comment effacer le contenu d'un Canvas ?
Auteurs : Guigui_ ,
canvas.delete(Tk.ALL)
Pour afficher une image autre que GIF ou PPM, il vous faudra passer par la bibliothèque PIL qui est capable de
lire tout type d'images.
Avec la fonction ImageTk.PhotoImage, vous créerez une image compatible Tkinter que vous pourrez afficher dans un
Canvas par la méthode create_image(position, **options) où position réprésente les 2 coordonnées du coin en haut à
gauche de l'image sachant que l'image sera aussi positionnée par rapport au paramètre anchor qui par défaut vaut
CENTER. Donc pour que l'image soit positionnée en haut à gauche du Canvas, vous devez utilisez la position 0, 0 et
rajouter le paramètre anchor = Tk.NW. Enfin le paramètre image représente l'image que vous voulez insérer.
Le Canvas ne s'adapte pas par défaut à la place que prennent les éléments que vous dessiner dedans. Donc si l'image que
vous insérez est trop grande, vous pouvez vous assurer qu'elle sera entièrement visible en renseignant les paramètres
width et height à la création du Canvas
image = Image.open("lenna.jpg")
photo = ImageTk.PhotoImage(image)
import Tkinter as Tk
root = Tk.Tk()
- 84 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
def ColorChange():
canvas.itemconfigure(oval, fill = "blue")
canvas.itemconfigure(rect, fill = "#67A12B")
canvas.itemconfigure(poly, fill = "#001020")
- 85 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Sommaire > GUI > Tkinter / Tix / Pmw > Tkinter > Text
Comment modifier le mode de coupure du texte ?
Auteurs : Guigui_ ,
text.config(state=Tk.DISABLED)
text.config(state=Tk.NORMAL) ## Remet le texte en mode normal
import Tkinter as Tk
root = Tk.Tk()
- 86 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
t1 = Tk.Text(f1, wrap=Tk.NONE)
root.mainloop()
- 87 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Sommaire > GUI > Tkinter / Tix / Pmw > Tkinter > Menu
Comment insérer une barre de menu ?
Auteurs : Guigui_ ,
le widget Menu peut être utiliser pour créer une barre de menu dans une fenêtre. Pour cela, vous devez tout d'abord
définir un premier Menu de parent une fenêtre ( mainmenu = Tk.Menu(root) ) puis associé ce menu à la fenêtre (
root.config(menu = mainmenu) ).
Pour ajouter des menus à la barre de menu, vous créerez de nouveaux Menu ayant pour parent le premier
menu crée ( menuExample = Tk.Menu(mainmenu) ) et sera insérée à la barre par la fonction add_cascade (
mainmenu.add_cascade(label = "Exemple", menu=menuExample) ). La fonction add_cascade(**options) peut recevoir
une liste de paramètres où les principaux sont label pour le titre du menu fils et menu représentant l'indentifiant du
menu fils en question.
Pour ajouter des options à un menu fils, vous utilisez la fonction add_command(**options) qui peut recevoir une liste
de paramètres et où les principaux sont label pour le titre de l'option et command qui représente la fonction associée
au clic sur l'option.
root.config(menu = mainmenu)
root.mainloop()
- 88 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
root = Tk.Tk()
mainmenu = Tk.Menu(root)
menuExample = Tk.Menu(mainmenu)
menuExample.add_command(label="Affiche", command=Affiche)
menuExample.add_separator() ## Ajout d'une ligne séparatrice
menuExample.add_command(label="Quitter", command=root.quit)
root.mainloop()
import Tkinter as Tk
root = Tk.Tk()
mainmenu = Tk.Menu(root)
menunondetachable = Tk.Menu(mainmenu, tearoff = 0)
menudetachable = Tk.Menu(mainmenu, tearoff = 1)
mainmenu.add_cascade(label="Menu1", menu = menunondetachable)
mainmenu.add_cascade(label="Menu2", menu = menudetachable)
menunondetachable.add_command(label="Quit", command = fenetre.quit)
menudetachable.add_command(label="Quit", command = fenetre.quit)
root.config(menu = mainmenu)
root.mainloop ()
- 89 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Sommaire > GUI > Tkinter / Tix / Pmw > Tkinter > tkMessageBox
Comment afficher une boîte de dialogue Information ?
Auteurs : Guigui_ ,
tkMessageBox.showinfo(strTitel, strMessage) ouvre une boite d'Information avec le message strMessage et le caption de
la boite strTitel
- 90 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Sommaire > GUI > Tkinter / Tix / Pmw > Tkinter > tkFileDialog
Comment afficher une boîte de dialogue pour sélectionner un fichier ?
Auteurs : Guigui_ ,
Il suffit d'utiliser la fonction tkFileDialog.askopenfilename(filetypes= tuplelist)
le paramètre facultatif filetypes est une list de tuple de strings de la forme (Nom du groupe des extensions, liste des
extensions). Cette fonction renvoie le chemin du fichier sélectionné si vous appuyez sur le bouton Ouvrir et '' si vous
appuyez sur le bouton Annuler
## exemple:
tkFileDialog.askopenfilename(filetypes = [("All", "*"),("Fichiers Python","*.py;*.pyw")])
## Exemple:
tkFileDialog.askdirectory(initialdir='c:/Python24')
- 91 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Sommaire > GUI > Tkinter / Tix / Pmw > Tkinter > Gestion de la géométrie
Quel gestionnaire de mise en place choisir ?
Auteurs : Guigui_ ,
Tkinter offre 3 gestionnaires différents de mise en place des widgets à savoir le packer, le gridder et la placer:
- Le packer permet de positionner des objets les uns par rapport aux autres en spécifiant simplement s'ils sont au-dessus,
en-dessous à gauche ou à droite dans leur conteneur (Frame ou Toplevel) respectif ou par rapport à un autre objet placé
précédemment. Dès que l'interface graphique est assez compliqué, pour ne pas avoir de surprise lors de la visualisation
à l'écran, ce gestionnaire nécessite l'utilisation abondante de sous-conteneurs.
- Le gridder permet de positionner des objets directement dans une grille en spécifiant la colonne et la rangée où se situera
l'objet. Ce gestionnaire est donc utile quand l'interface graphique propose une grille de widgets avec volonté d'avoir
des alignements respectés. - Le placer permet de positionner des objets dans leur conteneur en spécifiant directement
leur position au pixel près.
L'avantage des 2 premiers gestionnaires est que ceux-ci gèrent directement le redimensionnement des objets lorsque la
fenêtre conteneur est elle-même redimensionnée par l'utilisateur ou bien modifiée par l'ajout d'un nouvel objet.
Il est fortement conseillé d'utiliser le même gestionnaire de mise en place dans un même conteneur. Il est par contre tout
à fait possible pour une même interface graphique d'utiliser plusieurs gestionnaires de mise en place. Généralement,
le packer et le gridder sont les 2 gestionnaires que l'on conserve et que l'on retrouve simultanément dans une même
interface graphique.
- 92 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Sommaire > GUI > Tkinter / Tix / Pmw > Tkinter > Evènements
Comment associer un évènement clavier/souris à un widget ?
Auteurs : Guigui_ ,
Il suffit d'appeler la fonction w.bind(event_name, callable) où le string event_name représente l'évènement et callable
la fonction à appeler
## Exemple: Affichage dans un label du numéro du bouton de la souris sur le clic sur button
def updatelabel(evt):
label.configure(text=evt.num)
button.bind('<Button-1>', updatelabel)
button.bind('<Button-2>', updatelabel)
button.bind('<Button-3>', updatelabel)
## Exemple simple: on affiche la touche entrée au clavier quelquesoit le widget qui a le focus
import Tkinter as Tk
root = Tk.Tk()
e1 = Tk.Entry(root)
e2 = Tk.Entry(root)
e1.pack()
e2.pack()
def affiche(evt):
print evt.char
e1.bind_all('<Key>', affiche) ## ou e2.bind_all('<Key>', affiche) ou root.bind_all('<Key>', affiche)
root.mainloop()
- 93 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Sommaire > GUI > Tkinter / Tix / Pmw > Tkinter > Evènements > Evènements Clavier
Quels sont les noms des évènements associés au clavier ?
Auteurs : Guigui_ ,
L'utilisateur a pressé une touche quelconque: Key
L'utilisateur a pressé une touche spéciale:
- Touches de fonction: F1, F2, ..., F12
- Touches du curseur: Left, Right, Up, Down
- Touches "Pages vers le haut/bas": Prior, Next
- Touches libellés comme sur le clavier: End, Home, Insert, Print, Tab
- Touches "Suppr", "Fin", "Inser": Delete, End, Insert
- Touches "Esc" ou "Echap", "Entrée": Escape, Return
- Touches de verrouillage des majuscules, du clavier numérique et du défilement: Caps_Lock, Num_Lock, Scroll_Lock
- Touches "Alt", "Ctrl" et "Shift": Alt_L, Control_L, Shift_L
L'utilisateur a pressé une touche normale:
- le nom de l'évènement a le même nom que le nom de la touche: a, 1, +, ...
- Barre "Espace", caractère "<": space, less
L'utilisateur a pressé une combinaison de touches:
- "Alt/Shift/Ctrl + autre touche": Alt-, Shift-, Ctrl-
Remarque:
- Tous les évènements de plus de 2 caractères sont à mettre entre <...>
- Tous les évènements sont ensuite à mettre entre '...'
## Exemples:
def toucheevent(evt): ...
w.bind('x', touche) ## on lie l'appuie du caractère "x" avec la fonction toucheevent
w.bind('<Key>', toucheevent)
w.bind('<Left>' toucheevent)
w.bind('<Alt-Up>', toucheevent)
- 94 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Sommaire > GUI > Tkinter / Tix / Pmw > Tkinter > Evènements > Evènements Souris
Quels sont les noms des évènements associés à la souris ?
Auteurs : Guigui_ , airod ,
L'utilisateur a pressé un bouton: Button-1, Button-2, Button-3
L'utilisateur a déplacé la souris en maintenant un bouton: B1-Motion, B2-Motion, B3-Motion
L'utilisateur a double-cliqué sur un bouton: Double-Button-1, Double-Button-2, Double-Button-3
L'utilisateur a relâché un bouton: ButtonRelease-1, ButtonRelease-2, ButtonRelease-3
L'utilisateur a utilisé la roulette de la souris: MouseWheel L'utilisateur a déplacé la souris et elle est entrée dans un
widget: Enter
L'utilisateur a déplacé la souris et elle est sorite d'un widget: Leave
Remarque:
- Tous les évènements sont à mettre entre '<...>'
## Exemples:
def sourisevent(evt):
print dir(evt)
w.bind('<Button-1>',
sourisevent) ## on lie l'appuie du Bouton gauche de la souris avec la fonction sourisevent
w.bind('<ButtonRelease-2>',
sourisevent) ## on lie le relachement du Bouton du milieu de la souris avec la fonction sourisevent
w.bind('<Double-Button-3>', sourisevent) ## on lie le double-
clic du Bouton droit de la souris avec la fonction sourisevent
import Tkinter as Tk
root = Tk.Tk()
root.bind('<MouseWheel>', ScrollEvent)
root.mainloop()
- 95 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Sommaire > GUI > Tkinter / Tix / Pmw > Tkinter > Divers
Pourquoi j'obtiens le message AttributeError: 'NoneType' object has no attribute ... ?
Auteurs : Guigui_ ,
Ce message est souvent obtenu lorsque vous positionnez votre widget en même temps que vous le créez. Les fonctions
pack(), grid(...) ou place(...) ont None comme valeur de retour. Ainsi en manipulant en même temps la construction et
l'affichage du widget vous récupérer la valeur None au lieu de l'identifiant du widget.
Pensez toujours écrire ces actions en 2 lignes
Python 3.1b1 (r31b1:72424, May 7 2009, 15:38:57) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import tkinter
>>> img = tkinter.PhotoImage()
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
img = tkinter.PhotoImage()
File "C:\Python31\lib\tkinter\__init__.py", line 3269, in __init__
Image.__init__(self, 'photo', name, cnf, master, **kw)
File "C:\Python31\lib\tkinter\__init__.py", line 3210, in __init__
raise RuntimeError('Too early to create image')
RuntimeError: Too early to create image
>>> root = tkinter.Tk()
>>> img = tkinter.PhotoImage()
>>>
- 96 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
- 97 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Sommaire > GUI > Tkinter / Tix / Pmw > Tix > Widget
Comment manipuler les sous-widgets d'un widget Tix ?
Auteurs : Guigui_ ,
Les objets Tix sont souvent composés de différents objets Tkinter. Pour manipuler un objet Tix, il existe parfois des
méthodes spécifiques à cet objet ou bien vous pouvez accéder directement aux objets qui le composent. Pour cela, il
vous d'utiliser le dictionnaire w.subwidget_list qui regroupe tous les sous-objets (de premier niveau) de l'objet w. Pour
avoir cette liste, il vous suffit d'exécuter l'instruction print w.subwidget_list.keys().
- 98 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Sommaire > GUI > Tkinter / Tix / Pmw > Tix > Tix.Combobox
Comment créer un Combobox ?
Auteurs : Guigui_ ,
Tkinter ne propose pas le widget Combobox. On peut donc utiliser la bibliothèque Tix (qui est à priori installée avec
Python) ou Pmw pour récupérer ce widget. Le Combobox se compose d'un widget Entry et d'un widget Menu qui
contient les éléments sélectionnables. Les paramètres importants sont:
Si vous voulez avoir une Combobox dont on puisse uniquement sélectionnée une valeur dans une liste, il faut modifier
la propriété de l'état de l'Entry à readonly
import Tix
def Affiche(evt):
print varcombo.get() ## On affiche a l'ecran la valeur selectionnee
root = Tix.Tk()
varcombo = Tix.StringVar()
combo = Tix.ComboBox(root, editable=1, dropdown=1, variable=varcombo, command = Affiche)
combo.entry.config(state='readonly') ## met la zone de texte en lecture seule
combo.insert(0, 'NT')
combo.insert(1, 'Linux')
combo.pack()
root.mainloop()
import Tix
import Tkinter as Tk
root = Tix.Tk()
combo = Tix.ComboBox(root)
combo.insert(0,'elem1')
combo.insert(0,'elem2')
combo.insert(0,'elem3')
combo.pack()
def clear():
combo.subwidget_list['slistbox'].subwidget_list['listbox'].delete(0, Tk.END)
btn = Tix.Button(root, text='vider la liste', command=clear)
- 99 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
btn.pack()
root.mainloop()
- 100 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Sommaire > GUI > Tkinter / Tix / Pmw > Tix > Tix.Notebook
Comment changer la page visualisée à l'écran d'un Notebook ?
Auteurs : Guigui_ ,
Pour cela, il suffit d'utiliser la méthode notebook.raise_page(pagename) où pagename représente le nom d'une des page
créé dans le notebook
import Tix
import Tkinter as Tk
root = Tix.Tk()
nb = Tix.NoteBook(root)
nb.add("page1", label="page1")
nb.add("page2", label="page2")
p1 = nb.subwidget_list["page1"]
p2 = nb.subwidget_list["page2"]
b1 = Tk.Button(p1, text='Passe a la page 2', command=changepage2)
b2 = Tk.Button(p2, text='Passe a la page 1', command=changepage1)
nb.pack()
b1.pack()
b2.pack()
root.mainloop()
- 101 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Sommaire > GUI > Tkinter / Tix / Pmw > Tix > Tix.Meter
Comment créer un Meter ?
Auteurs : Guigui_ ,
Le widget Meter proposé par la bibliothèque Tix permet de créer un widget appelé plus communément progressbar. Son
utilisation est très simple. Son attribut value doit être compris entre 0 (barre vide) et 1 (barre pleine). Avec la méthode
meter.config(value = newvalue), vous pouvez changer cette valeur. Ne pas oublier de forcer un raffraîchissement d'écran
(meter.update()) si on veut que l'affichage à l'écran prenne immédiatement la modification en cours.
import Tix
root = Tix.Tk()
meter = Tix.Meter(root, value=0.)
meter.pack()
def go():
for i in range(10000):
meter.config(value=float(i)/10000)
meter.update()
- 102 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Sommaire > GUI > Tkinter / Tix / Pmw > Tix > Tix.Balloon
Comment afficher une infobulle quand on passe au dessus d'un widget ?
Auteurs : Guigui_ ,
- 103 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Vous trouverez tous les liens pour télécharger wxPython sur la page http://wxpython.org/download.php. Vous
pourrez récupérer les sources ou les binaires précompilés pour un bon nombre de distributions (Windows, Linux, Mac).
Vous pourrez également télécharger les démos et exemples (environ 200), ressources indispensables pour apprendre
efficacement à développer avec wxPython
Tutoriels
•
Programmer des interfaces graphiques avec le framework open source wxPython
Documentation officielle
•
wxDocs
•
wxPyDocs
Livres
•
wxPython in Action
import wx
app = wx.PySimpleApp()
frameicon = wx.Icon("./appicon.ico", wx.BITMAP_TYPE_ICO)
frame = wx.Frame(None, -1)
frame.SetIcon(frameicon)
frame.Show()
- 104 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
app.MainLoop()
import wx
app = wx.PySimpleApp()
btn.Bind(wx.EVT_BUTTON, GetPassword)
frame.Show()
app.MainLoop()
import wx
app = wx.PySimpleApp()
frm = wx.Frame(None)
lb = wx.ListBox(frm, -1, pos = (200, 200), choices = ["WaitAni", "ArrowBlue", "Arrow", "Hand"],
style = wx.LB_SINGLE)
def ChangeCursor(event):
if event.GetString() == "WaitAni": frm.SetCursor(CURSOR_ANIWAIT)
elif event.GetString() == "ArrowBlue": frm.SetCursor(CURSOR_ARROWBLUE)
elif event.GetString() == "Arrow": frm.SetCursor(CURSOR_ARROW)
elif event.GetString() == "Hand": frm.SetCursor(CURSOR_HAND)
- 105 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
lb.Bind(wx.EVT_LISTBOX, ChangeCursor)
frm.Show(True)
app.MainLoop()
import wx
app = wx.PySimpleApp()
app.MainLoop()
- 106 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Documentation officielle
•
Tutoriel PyGTK 2.0 (traduction)
•
PyGTK Tutorial 2.0
Forum
• Forum PyGTK
class TestUpdate:
def affiche(self, widget, data=None):
for i in range(100000):
self.lbl.set_text(str(i))
## Raffraîchissement de la fenêtre pour voir l'apparition de tous les nombres
gtk.main_iteration()
def __init__(self):
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.set_resizable(True)
self.window.set_title("Test Raffraîchissement")
self.window.set_border_width(0)
vbox = gtk.VBox(False, 5)
vbox.set_border_width(10)
self.window.add(vbox)
vbox.show()
button = gtk.Button("Affiche")
button.connect("clicked", self.affiche)
vbox.pack_start(button, False, False, 0)
- 107 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
button.set_flags(gtk.CAN_DEFAULT)
button.grab_default ()
button.show()
self.window.show()
def main():
gtk.main()
return 0
if __name__ == "__main__":
TestUpdate()
main()
- 108 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Il peut cependant y avoir des interférences avec des modules de déboggage (le profiler par exemple)
import time
l = range(100000)
tps1 = time.clock()
random.shuffle(l)
l.sort()
tps2 = time.clock()
print(tps2 - tps1)
Si vous n'avez pas besoin d'une précision très importante, l'usage de time.clock suffira amplement. Sinon optez pour
le module timeit.
Ce module propose principalement la création d'un objet timeit.Timer([stmt='pass'[, setup='pass'[, timer=<timer
function>]]]) où stmt est la portion de code sous forme d'une chaîne de caractères qui va être évaluée, setup représente
(toujours sous forme d'une chaîne de caractères), les conditions d'initialisation. Ces 2 paramètres peuvent également
être des objets qui sont appelable sans arguments.
Cet objet possède 2 méthodes Timer.timeit([number=1000000]) et Timer.repeat([repeat=3[, number=1000000]]).
La première fonction retourne le temps total des instructions exécutées number fois.
La deuxième reproduit l'expérience de la première repeat fois. Le temps à considérer sera alors le minimum des temps
obtenus
import timeit
import random
Il faut bien faire attention à la validation des données en sachant que la condition setup n'est exécutée qu'une seule fois
au tout début. C'est pourquoi il peut être aussi bien de travailler directement sur l'appel d'une fonction qui initialisera
elle-même les paramètres à chaque exécution. Dans ce cas-là, le paramètre setup contient simplement l'importation de
la fonction étudiée.
- 109 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Autrement, il suffit de prendre comme paramètre stmt directement la fonction étudiée sous forme d'objet.
def sort():
l = range(100000)
random.shuffle(l)
l.sort()
test3 = timeit.Timer(sort)
print(test3.timeit(10))
print(test3.repeat(3, 10))
lien : Python Library Reference: timeit # Measure execution time of small code snippets
- 110 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
- 111 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
testpy2exe.py
raw_input("test minimal de py2exe")
Dans le fichier setup.py, il faudra toujours faire les 2 importations et appeler la fonction setup avec des arguments qui
varieront en fonction du programme à "compiler". Dans notre cas, nous avons un unique fichier .py exécuté en mode
console. Si notre fichier a une interface graphique (développé sous Tkinter, wxPython, ...), il faudra remplacer le terme
console par windows
setup.py
from distutils.core import setup
import py2exe
setup(console=["testpy2exe.py"])
Il suffit ensuite d'exécuter, dans une fenêtre DOS (et non une console Python), la commande suivante qui crééra une
distribution.
2 répertoires sont créés: dist et build - ce dernier ne sert que lors de la construction de la distribution et peut donc
être effacé
Dans le répertoire dist, vous récupérerez les fichiers:
- 112 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Tous ces fichiers ne sont pas forcément utiles. Cela dépendra du contenu de votre fichier .py
Dans notre cas, seuls Python25.dll, library.zip et test2pyexe.exe nous sont utiles.
Si vous utilisez d'autres bibliothèques, visitez le lien suivant si vous rencontrez des difficultés: http://
starship.python.net/crew/theller/moin.cgi/Py2Exe
test.py
import Tkinter as Tk
import sys
root = Tk.Tk()
btn = Tk.Button(root, text = 'Quitter', command = sys.exit)
btn.pack()
root.mainloop()
setup.py
from distutils.core import setup
import py2exe
setup(windows=["test.py"])
testpy2exe.py
raw_input("test minimal de py2exe")
setup.py
from distutils.core import setup
import py2exe
setup(
zipfile = None,
- 113 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
setup.py
console=["testpy2exe.py"])
test.py
import Tix
root = Tix.Tk()
root.mainloop()
Dans le fichier setup.py, on liste l'ensemble des fichiers requis pour le bon fonctionnement de Tix que l'on insère dans
le setup de py2exe par le paramètre data_files contenant une liste de tuples (répertoire de destination relatif au répertoire
d'exécution du programme, liste des fichiers à copier dans ce répertoire). Attention, c'est exemple a été testé avec Python
2.5.2, Py2exe 0.6.8 et Tix 8.4.0. Si vous utilisez d'autres versions, il sera peut-être nécessaire de faire des ajustements
dans les fichiers à insérer.
setup.py
import sys
import os
import glob
import os.path
def listdirectory(path):
return filter(os.path.isfile, glob.glob(path + os.sep + '*'))
data_files=[
('Dlls', glob.glob(sys.prefix+'/DLLs/tix84.dll')),
('tcl/tix8.4', listdirectory(sys.prefix+'/tcl/tix8.4')),
('tcl/tix8.4/bitmaps', listdirectory(sys.prefix+'/tcl/tix8.4/bitmaps')),
('tcl/tix8.4/pref', listdirectory(sys.prefix+'/tcl/tix8.4/pref')),
]
setup(
script_args = ['py2exe'],
data_files = data_files,
- 114 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
setup.py
windows = ['test.py'])
test.py
import Pmw
root = Pmw.initialise()
root.mainloop()
Dans le fichier setup.py, nous allons tout d'abord modifier le fichier bundlepmw.py qui importe le module regsub qui
n'existe plus à partir de la version 2.5 de Python (donc si vous travaillez avec une version plus ancienne, vous n'avez
pas à faire cette manipulation).
Ensuite, nous exécutons ce fichier qui créera un fichier Pmw.py contenant tous les fichiers internes à Pmw. Nous copions
enfin les fichiers PmwBlt.py et PmwColor.py.
Attention, c'est exemple a été testé avec Python 2.5.2, Py2exe 0.6.8 et Pmw 1.3.2. Si vous utilisez d'autres versions, il
sera peut-être nécessaire de faire des ajustements dans les fichiers à insérer.
Le fichier setup correspondant:
setup.py
from distutils.core import setup
import py2exe
import os
import sys
import subprocess
import shutil
## si le fichier bundlepmw.py contient l'importation regsub (qui n'existe plus depuis la version 2.5 de Python)
## Vous pouvez sinon le faire à la main en remplaçant "regsub" par "re" et "gsub" par "sub"
fp = open(sys.prefix + os.sep + "Lib/site-packages/Pmw/Pmw_1_3/bin/bundlepmw.py")
a = fp.read().replace("regsub", "re").replace("gsub", "sub")
fp.close()
ft = open(sys.prefix + os.sep + "Lib/site-packages/Pmw/Pmw_1_3/bin/bundlepmw.py", "w")
ft.write(a)
ft.close()
setup(windows = ['test.py'])
- 115 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
- 116 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
Comment récupérer dans une liste les valeurs des pixels d'une image ?
Auteurs : Guigui_ ,
La fonction Image.open(path) permet d'ouvrir une image de tout format (compatible avec la bibliothèque Pil)
la fonction im.getdata() retourne un objet-séquence contenant les valeurs des pixels de l'image. Cependant il n'est lisible
que par Pil. La fonction list permet ensuite de récupérer cette séquence sous un format lisible par l'utilisateur. On
récupère alors une liste de tuples à 3 compoantes si l'image est couleur, une liste simple sinon.
import Image
im = Image.open("Python.jpg")
data = list(im.getdata())
- 117 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
import Image
img = Image.open("Python.jpg") ## Ouverture de l'image Python.jpg
r,g,b = img.split() ## Récupération des différentes composantes de l'image
r.save('r.jpg') ## Sauvegarde des différents images composantes
g.save('g.jpg')
b.save('b.jpg')
import Image
img = Image.open("Python.jpg") ## Ouverture de l'image Python.jpg
comp = img.split() ## Décomposition de l'image
imgnew = Image.merge('RGB',comp) ## Recomposition de l'image
imgnew.save("PythonNew.jpg") ## Sauvegarde de l'image décomposée puis recomposée
• Tout d'abord, vous avez un de votre propre module qui se nomme également Image. Ainsi, au lieu d'importer le
module de Pil, vous importez finalement votre propre module qui ne contient pas les fonctions du module Image
de Pil.
• D'autres bibliothèques que vous utilisez peuvent également contenir un module Image. Si vous les importez de
la manière from ... import *, il se peut donc que vous importiez un module Image qui écrasera celui du module
Pil (ou inversement, en fonction de la position des imports). C'est une des raisons qui font qu'il est déconseillé
d'utilisez ce schéma pour l'importation.
Par exemple, le module Tkinter contient un module Image et de ce fait l'instruction from Tkinter import *
écrasera le module Image de Pil que vous auriez pu importer auparavant. C'est pour cela qu'il est préférable
pour Tkinter d'importer de la manière import Tkinter as Tk.
- 118 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/
FAQ Python
- 119 -
Les sources présentées sur cette pages sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre la page de présentation de ces sources
constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2005-2009 Developpez LLC. Tout droits réservés Developpez LLC. Aucune
reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez
LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
http://python.developpez.com/faq/