PyGTK, ben c'est génial !
Par syeric, dimanche 24 juin 2007 à 20:41 :: Python :: #14 :: rss
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 !
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...
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.
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()
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() :
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
Commentaires
1. Le jeudi 28 juin 2007 à 01:01, par Get
2. Le vendredi 25 septembre 2009 à 01:37, par damedecoeur
3. Le dimanche 13 décembre 2009 à 06:27, par bilbawa
Ajouter un commentaire