PyGTK, ben c'est génial !
Par syeric, dimanche 24 juin 2007 à 20:41 :: Python
Bonjour !
Haaa, pygtk c'est génial :) Et en ce moment je m'amuse ! Je me suis mis en tête de générer une série de pages, des tutoriels par exemple, où on navigue avec des boutons "Continuer" et "Précédent", mais le tout automatiquement et uniquement avec des fichiers texte. Ca présente l'intérêt que une fois que vous avez fait le programme, ben pour modifier le contenu et faire des ajouts, vous n'avez besoin de rien d'autre que des fichiers textes ;-)
Voyons ça de plus près ;-)
C'est des fonctions que l'on va appeler depuis un autre script.
On commence par la fonction widget_tuto qui génère le cadre dans lequel va se trouver le document et les boutons et même une image !
[python]
def widget_tuto(fichier):
"Fonction qui génère la box qui va contenir la page du tuto et les boutons"
#Un petit cadre
cadre = gtk.Frame()
#cération d'une boite horizontale
box1=gtk.HBox(False, 5)
#on l'ajoute au cadre
cadre.add(box1)
#Fenetre "scrollable"
fd = gtk.ScrolledWindow()
fd.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
#On l'ajoute à la box1
box1.pack_start(fd, True, True, 10)
#on importe le texte
text=chainaslist(fichier)
#on crée une boite verticale
box=gtk.VBox(False, 5)
#on l'incorpore à la fenêtre scrollable
fd.add_with_viewport(box)
#On crée un label
label1=gtk.Label()
#On rempli le label avec text en tenant compte des balise
label1.set_markup(text)
#On ajoute le label à box
box.pack_start(label1, False, False, 5)
#On crée une image
image = gtk.Image()
#on l'importe à partir du nom donné dans le fichier du tuto
image.set_from_file(getimage(fichier))
#on la met dans la box
box.pack_start(image, False, False, 5)
#on crée le bouton suivant avec la fonction get_next
next=get_next(fichier)
#on crée le bouton précédent avet la foction get_previous
previous=get_previous(fichier)
#si c'est le premier
if previous=="first":
boutonnext=gtk.Button("Continuer")
boutonnext.connect("clicked", nexttuto, next, cadre, box1)
#On crée une boite horizontale
box2=gtk.HBox(False, 5)
#on y met le bouton
box2.pack_start(boutonnext, False, False, 5)
else:
boutonprev=gtk.Button("Précédent")
boutonprev.connect("clicked", nexttuto, previous, cadre, box1)
boutonnext=gtk.Button("Continuer")
boutonnext.connect("clicked", nexttuto, next, cadre, box1)
#On crée une boite horizontale
box2=gtk.HBox(False, 5)
#on y met le bouton
box2.pack_start(boutonnext, False, False, 5)
box2.pack_start(boutonprev, False, False, 5)
#on met la box2 dans box
box.pack_start(box2, False, False, 5)
#on montre tout ça
cadre.show_all()
return cadre
Bon ! Il y a une série de fonctions la dedans. Déjà, lorsqu'il s'agit des pages suivantes, il faut créer une deuxième fonction, quasi identique sauf qu'il n'y a pas le cadre...
[python]
def widget_tuto2(fichier, cadre):
"fonction qui va générer les tutos suivants"
#cération d'une boite horizontale
box1=gtk.HBox(False, 5)
#Fenetre "scrollable"
fd = gtk.ScrolledWindow()
fd.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
#On l'ajoute à la box1
box1.pack_start(fd, True, True, 10)
#on importe le texte
text=chainaslist(fichier)
#on crée une boite verticale
box=gtk.VBox(False, 5)
#on l'incorpore à la fenêtre scrollable
fd.add_with_viewport(box)
#On crée un label
label1=gtk.Label()
#On rempli le label avec text en tenant compte des balise
label1.set_markup(text)
#On ajoute le label à box
box.pack_start(label1, False, False, 5)
#On crée une image
image = gtk.Image()
#on l'importe à partir du nom donné dans le fichier du tuto
image.set_from_file(getimage(fichier))
#on la met dans la box
box.pack_start(image, False, False, 5)
#on crée le bouton suivant avec la fonction get_next
next=get_next(fichier)
#on crée le bouton précédent avet la foction get_previous
previous=get_previous(fichier)
#si c'est le premier
if previous=="first":
boutonnext=gtk.Button("Continuer")
boutonnext.connect("clicked", nexttuto, next, cadre, box1)
#On crée une boite horizontale
box2=gtk.HBox(False, 5)
#on y met le bouton
box2.pack_start(boutonnext, False, False, 5)
else:
boutonprev=gtk.Button("Précédent")
boutonprev.connect("clicked", nexttuto, previous, cadre, box1)
boutonnext=gtk.Button("Continuer")
boutonnext.connect("clicked", nexttuto, next, cadre, box1)
#On crée une boite horizontale
box2=gtk.HBox(False, 5)
#on y met le bouton
box2.pack_start(boutonnext, False, False, 5)
box2.pack_start(boutonprev, False, False, 5)
#on met la box2 dans box
box.pack_start(box2, False, False, 5)
#on montre tout
box1.show_all()
return box1
Bien, ensuite, les fonctions get_next et get_previous.
[python]
def get_next(fichier):
#on ouvre fichier grace à la fonction openfilelist de fileFunctions.py
chaine=fileFunctions.openfilelist(fichier)
#On évalue le nombre de lignes
a=len(chaine)
#chaine de caractère qui va être le nom du fichier
name=chaine[a-3]
#chaine de caractères qui est le nom du tuto
name_tuto=chaine[a-1]
#enfin, le chemin global du fichier (fonction suppr_char supprime le retour chariot en fin de ligne)
finalchar=".""/Tutos/"+fileFunctions.suppr_char(name_tuto)+"/text/"+fileFunctions.suppr_char(name)
return finalchar
def get_previous(fichier):
#on ouvre fichier grace à la fonction openfilelist de fileFunctions.py
chaine=fileFunctions.openfilelist(fichier)
#On évalue le nombre de lignes
a=len(chaine)
#chaine de caractère qui va être le nom du fichier
name=chaine[a-2]
#chaine de caractères qui est le nom du tuto
name_tuto=chaine[a-1]
finalchar=""
#enfin, le chemin global du fichier (fonction suppr_char supprime le retour chariot en fin de ligne)
if name=="first\n":
finalchar="first"
else:
finalchar=".""/Tutos/"+fileFunctions.suppr_char(name_tuto)+"/text/"+fileFunctions.suppr_char(name)
return finalchar
fileFunctions.suppr_char() est une fonction de fileFunctions.py qui supprime le retour charriot en fin de ligne.
La fonction chainaslist()
[python] def chainaslist(fichier): "fonction qui va ouvrir fichier et retourner la chaine de caratères entre le début et la balise [endtext]" #on ouvre le fichier chaine=fileFunctions.openfilelist(fichier) #variable de boucle i=0 #on crée une chaine de caractère vide txt txt='' #Et c'est parti, tant que la ligne est différente de [endtext]\n, on rempli txt avec son contenu plus la ligne while chaine[i] != "[endtext]\n": txt=txt+chaine[i] i=i+1 #on retourne txt return txt
Enfin, la fonction nexttuto() :
[python] def nexttuto(widget, fichier, cadre, wid): cadre.remove(wid) box=widget_tuto2(fichier, cadre) cadre.add(box) cadre.show_all()
Alors, qu'est ce que ça fait tout ça ? Ca va générer un cadre dans lequel il y a un texte qui est lu dans "fichier" jusqu'à la balise endtext en prenant en compte le balisage pango. Ensuite, ça prend une image avec getimage en lisant dans le fichier le nom de l'image dans fichier. Ensuite, ça défini les boutons. Si l'avant dernière ligne de fichier est égale à "first", alors on ne met pas de bouton précédent. Sinon, et bien on crée les deux boutons, on lit le nom des fichiers qui correspondent aux suivant et précédent dans fichier, et grace à la fonction nextuto, on détruit l'intérieur du cadre et on régénère le nouveau document avec les nouveaux noms.
Au final, si vous voulez ajouter des documents, en enlever etc, vous avez juste à modifier les noms dans les fichiers ;-)
A bientôt.
Sylvain