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