issue49:tutopython
Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
issue49:tutopython [2011/06/21 19:15] – andre_domenech | issue49:tutopython [2011/07/06 12:19] (Version actuelle) – peji | ||
---|---|---|---|
Ligne 15: | Ligne 15: | ||
Maintenant il est temps de terminer notre projet. Nous commencerons à coder là où nous en étions resté le mois dernier. | Maintenant il est temps de terminer notre projet. Nous commencerons à coder là où nous en étions resté le mois dernier. | ||
- | La première chose que je veux faire est de modifier le code de la classe DialogueFichier. Si vous vous souvenez de la dernière fois, si l' | + | La première chose que je veux faire est modifier le code de la classe DialogueFichier. Si vous vous souvenez de la dernière fois, si l' |
- | Comme vous pouvez le supposer, cela regarde simplement la valeur de chaque touche enfoncée lorsque l' | + | Comme vous pouvez le supposer, cela regarde simplement la valeur de chaque touche enfoncée lorsque l' |
**Now on to new code. Let's deal with the toolbar button ClearAll. When the user clicks this button, we want the treeview and the ListStore to be cleared. This is a simple one-liner that we can put into the on_tbtnClearAll_clicked routine. | **Now on to new code. Let's deal with the toolbar button ClearAll. When the user clicks this button, we want the treeview and the ListStore to be cleared. This is a simple one-liner that we can put into the on_tbtnClearAll_clicked routine. | ||
Ligne 44: | Ligne 44: | ||
The first line creates the TreeSelection object. We use that to get the rows selected (which is only one because we didn't set the model to support multiple selections), | The first line creates the TreeSelection object. We use that to get the rows selected (which is only one because we didn't set the model to support multiple selections), | ||
- | Je sais que vous pensez : « mais bon sang, qu' | + | Je sais que vous pensez : « Mais bon sang, qu' |
Regardez la boucle for. On utilise un itérateur pour parcourir la liste ListeFichiers. Dans ce cas, l' | Regardez la boucle for. On utilise un itérateur pour parcourir la liste ListeFichiers. Dans ce cas, l' | ||
Ligne 66: | Ligne 66: | ||
We can now start work on the move functions. Let's start with the Move To Top routine. Like we did when we wrote the delete function, we get the selection and then the selected row. Next we have to step through the rows to get two variables. We will call them path1 and path2. Path2, in this case will be set to 0, which is the “target” row. Path1 is the row the user has selected. We finally use the model.move_before() method to move the selected row up to row 0, effectively pushing everything down. We'll put the code (below right) directly in the on_tbtnMoveToTop_clicked routine.** | We can now start work on the move functions. Let's start with the Move To Top routine. Like we did when we wrote the delete function, we get the selection and then the selected row. Next we have to step through the rows to get two variables. We will call them path1 and path2. Path2, in this case will be set to 0, which is the “target” row. Path1 is the row the user has selected. We finally use the model.move_before() method to move the selected row up to row 0, effectively pushing everything down. We'll put the code (below right) directly in the on_tbtnMoveToTop_clicked routine.** | ||
- | Maintenant que l'on a un chemin (cf) et un nom de fichier (nf), on peut ouvrir le fichier, imprimer notre en-tête M3U et parcourir la liste de lecture. Le chemin est stocké (si vous vous souvenez) dans la colonne 2, le nom du fichier dans la colonne 0, et l' | + | Maintenant que l'on a un chemin (cf) et un nom de fichier (nf), on peut ouvrir le fichier, imprimer notre en-tête M3U et parcourir la liste de lecture. Le chemin est stocké (si vous vous souvenez) dans la colonne 2, le nom du fichier dans la colonne 0 et l' |
On peut maintenant commencer à travailler sur les fonctions de déplacement. Commençons par la routine Haut. Comme nous l' | On peut maintenant commencer à travailler sur les fonctions de déplacement. Commençons par la routine Haut. Comme nous l' | ||
Ligne 74: | Ligne 74: | ||
Now let's take a look at what it will take to do the MoveUp routine. Once again, it is fairly similar to the last two functions we created. This time, we get path1 which is the selected row and then assign that row number–1 to path2. Then IF path2 (the target row) is greater than or equal to 0, we use the model.swap() method (second down, right).** | Now let's take a look at what it will take to do the MoveUp routine. Once again, it is fairly similar to the last two functions we created. This time, we get path1 which is the selected row and then assign that row number–1 to path2. Then IF path2 (the target row) is greater than or equal to 0, we use the model.swap() method (second down, right).** | ||
- | Pour la fonction Bas, nous utiliserons presque le même code que pour la routine Haut, mais au lieu d' | + | Pour la fonction Bas, nous utiliserons presque le même code que pour la routine Haut, mais au lieu d' |
Maintenant regardons ce que donne la fonction Monter. À nouveau, elle est très ressemblante aux deux fonctions que nous venons de créer. Cette fois-ci, on a chemin1 qui contient la ligne sélectionnée, | Maintenant regardons ce que donne la fonction Monter. À nouveau, elle est très ressemblante aux deux fonctions que nous venons de créer. Cette fois-ci, on a chemin1 qui contient la ligne sélectionnée, | ||
Ligne 88: | Ligne 88: | ||
C'est la même chose pour la fonction Descendre. Cette fois-ci, on vérifie que chemin2 est plus PETIT ou égal à self.NombreDeLignes-1 (troisième en bas à droite). | C'est la même chose pour la fonction Descendre. Cette fois-ci, on vérifie que chemin2 est plus PETIT ou égal à self.NombreDeLignes-1 (troisième en bas à droite). | ||
- | Maintenant, modifions quelques fonctionnalités de notre liste de lecture. Dans l' | + | Maintenant, modifions quelques fonctionnalités de notre liste de lecture. Dans l' |
Cependant, je vous ai indiqué qu'il y avait aussi un format étendu. Dans le format étendu, il y a une ligne supplémentaire que l'on peut ajouter au fichier avant chaque chanson, contenant des informations supplémentaires sur la chanson. Le format de cette ligne est le suivant : | Cependant, je vous ai indiqué qu'il y avait aussi un format étendu. Dans le format étendu, il y a une ligne supplémentaire que l'on peut ajouter au fichier avant chaque chanson, contenant des informations supplémentaires sur la chanson. Le format de cette ligne est le suivant : | ||
Ligne 98: | Ligne 98: | ||
Again, to refresh your memory, I'll walk through the code. First we clear the three return variables so that if anything happens they are blank upon return. We then pass in the filename of the MP3 file we are going to look at. Next we pull the keys into (yes, you guessed it) an iterator, and walk through that iterator looking for two specific tags. They are ' | Again, to refresh your memory, I'll walk through the code. First we clear the three return variables so that if anything happens they are blank upon return. We then pass in the filename of the MP3 file we are going to look at. Next we pull the keys into (yes, you guessed it) an iterator, and walk through that iterator looking for two specific tags. They are ' | ||
- | Vous vous demandez | + | Vous vous demandiez |
- | À nouveau, pour vous rafraîchir la mémoire, je vais parcourir le code. Tout d' | + | À nouveau, pour vous rafraîchir la mémoire, je vais parcourir le code. Tout d' |
**Now, we will want to modify the SavePlaylist function to support the extended information line. While we are there, let's check to see if the filename exists, and, if so, flag the user and exit the routine. Also, to make things a bit easier for the user, since we don't support any other filetype, let's automatically append the extension ' | **Now, we will want to modify the SavePlaylist function to support the extended information line. While we are there, let's check to see if the filename exists, and, if so, flag the user and exit the routine. Also, to make things a bit easier for the user, since we don't support any other filetype, let's automatically append the extension ' | ||
Ligne 110: | Ligne 110: | ||
| | ||
- | On va maintenant modifier la fonction SauvegarderListe pour qu' | + | On va maintenant modifier la fonction SauvegarderListe pour qu' |
Tout comme pour la fonction AjouterFichiers, | Tout comme pour la fonction AjouterFichiers, | ||
Ligne 124: | Ligne 124: | ||
Line 2 opens the file we are going to write. Line 3 puts the M3U header in. Line 4 sets up for a walk through the playList ListStore. Line 5 creates the filename from the three columns of the ListStore. Line 6 calls GetMP3Info and stores the return values into variables. Line 7 then checks to see if we have values in all three variables. If so, we write the extended information line in line 8, otherwise we don't try. Line 9 writes the filename line as before. Line 10 closes the file gracefully, and line 11 pops up the message box letting the user know the process is all done.** | Line 2 opens the file we are going to write. Line 3 puts the M3U header in. Line 4 sets up for a walk through the playList ListStore. Line 5 creates the filename from the three columns of the ListStore. Line 6 calls GetMP3Info and stores the return values into variables. Line 7 then checks to see if we have values in all three variables. If so, we write the extended information line in line 8, otherwise we don't try. Line 9 writes the filename line as before. Line 10 closes the file gracefully, and line 11 pops up the message box letting the user know the process is all done.** | ||
- | Ensuite on veut entourer le reste de la fonction dans une clause IF|ELSE (en haut à droite) pour que si le fichier existe déjà on puisse simplement sortir de la routine. On utilise os.path.exists(nom du fichier) pour cette vérification. | + | Ensuite on veut entourer le reste de la fonction dans une clause IF|ELSE (en haut à droite) pour que, si le fichier existe déjà, on puisse simplement sortir de la routine. On utilise os.path.exists(nom du fichier) pour cette vérification. |
Le reste du code sert principalement à sauvegarder comme précédemment, | Le reste du code sert principalement à sauvegarder comme précédemment, | ||
- | La ligne 2 ouvre le fichier dans lequel nous allons écrire. La ligne 3 y place l' | + | La ligne 2 ouvre le fichier dans lequel nous allons écrire. La ligne 3 y place l' |
**Go ahead and save your code and give it a test drive. | **Go ahead and save your code and give it a test drive. | ||
Ligne 136: | Ligne 136: | ||
We are using the widget references we set up earlier, and then setting the text for the tooltip via the (you guessed it) set_tooltip_text attribute. Next we need to add the call to the routine. Back in the __init__ routine, after the self.SetWidgetReferences line, add: | We are using the widget references we set up earlier, and then setting the text for the tooltip via the (you guessed it) set_tooltip_text attribute. Next we need to add the call to the routine. Back in the __init__ routine, after the self.SetWidgetReferences line, add: | ||
- | self.SetupBullesAide()** | + | self.SetupToolTops()** |
Allez, sauvegardez votre code et essayez-le. | Allez, sauvegardez votre code et essayez-le. | ||
- | À ce point, la seule chose qu'on pourrait encore ajouter serait des bulles d'aide lorsque l' | + | À ce stade, la seule chose qu'on pourrait encore ajouter serait des bulles d'aide lorsque l' |
- | Nous utilisons le widget references que nous avons réglé plus haut, puis on règle le texte pour la bulle d'aide avec (vous l' | + | Nous utilisons le widget references que nous avons réglé plus haut, puis on règle le texte pour la bulle d'aide avec (vous l' |
- | self.SetupToolTops() | + | self.SetupBullesAide() |
**Last, but certainly not least, we want to put our logo into our About box. Just like everything else there, there' | **Last, but certainly not least, we want to put our logo into our About box. Just like everything else there, there' | ||
Ligne 156: | Ligne 157: | ||
Until next time, enjoy your new found skills.** | Until next time, enjoy your new found skills.** | ||
- | Pour finir, mais est-ce vraiment la fin, on veut placer notre logo dans la boîte APropos. Comme tout le reste ici, il y a un attribut pour faire cela. Ajoutez la ligne suivante à la routine APropos. | + | Enfin et surtout (!), on veut placer notre logo dans la boîte APropos. Comme tout le reste ici, il y a un attribut pour faire cela. Ajoutez la ligne suivante à la routine APropos |
apropos.set_logo(gtk.gdk.pixbuf_new_from_file(" | apropos.set_logo(gtk.gdk.pixbuf_new_from_file(" | ||
- | Et voilà. Vous avez maintenant une application complète | + | Et voilà. Vous avez maintenant une application complète, fonctionnelle et jolie, qui fait un travail merveilleux de création de liste de lecture pour vos fichiers de musique. |
Le code complet, incluant le fichier glade que nous avons créé le mois dernier, est disponible ici : http:// | Le code complet, incluant le fichier glade que nous avons créé le mois dernier, est disponible ici : http:// |
issue49/tutopython.1308676559.txt.gz · Dernière modification : 2011/06/21 19:15 de andre_domenech