Outils pour utilisateurs

Outils du site


issue52:tutopython

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
issue52:tutopython [2011/09/28 13:49] auntieeissue52:tutopython [2011/11/02 15:29] (Version actuelle) – corrections mineurs de participa passé ald infinitif et singulier avec s marchois
Ligne 9: Ligne 9:
 Aussi, ce mois-ci, nous allons approfondir les fenêtres, les boutons et les étiquettes, et introduire les cases à cocher, les boutons radio, les zones de texte (ou widgets Entry), les listes avec une barre de défilement verticale (ListBox) et les fenêtres de message. Avant de commencer, examinons certains de ces widgets. Aussi, ce mois-ci, nous allons approfondir les fenêtres, les boutons et les étiquettes, et introduire les cases à cocher, les boutons radio, les zones de texte (ou widgets Entry), les listes avec une barre de défilement verticale (ListBox) et les fenêtres de message. Avant de commencer, examinons certains de ces widgets.
  
-Les cases à cocher servent à faire plusieurs choix parmi plusieurs propositions et ont deux états : cochée ou non cochée, ou on pourrait dire aussi oui ou non. Elles sont généralement utilisées pour fournir une série d'options et quelques-unes, plusieurs ou toutes ces options peuvent être sélectionnées. Vous pouvez définir un événement pour vous informer quand la case a été cochée ou décochée ou tout simplement pour interroger la valeur du widget à tout moment.+Les cases à cocher servent à faire plusieurs choix parmi plusieurs propositions et ont deux états : cochée ou non cochée, ou on pourrait dire aussi oui ou non. Elles sont généralement utilisées pour fournir une série d'options où une, quelques-unes ou toutes peuvent être sélectionnées. Vous pouvez définir un événement pour vous informer quand la case a changé d'état ou tout simplement pour interroger la valeur du widget à tout moment.
  
-Les boutons radio servent à faire un choix parmi plusieurs propositions. Ils ont aussi deux états, oui ou non. Cependant, ils sont groupés ensemble pour fournir un groupe d'options dont une seule peut être choisie. Vous pouvez avoir plusieurs groupes de boutons radio qui, s'ils sont bien programmés, n'interféreront pas l'un avec l'autre.+Les boutons radio servent à faire un choix parmi plusieurs propositions. Ils ont aussi deux états, oui ou non. Cependant, ils sont groupés ensembles pour fournir un groupe d'options dont une seule peut être choisie. Vous pouvez avoir plusieurs groupes de boutons radio qui, s'ils sont bien programmés, n'interféreront pas entre eux.
  
 **A Listbox provides a list of items for the user to select from. Most times, you want the user to select only one of the items at a time, but there can be occasions that you will allow the user to select multiple items. A scroll bar can be placed either horizontally or vertically to allow the user to easily look through all the items available. **A Listbox provides a list of items for the user to select from. Most times, you want the user to select only one of the items at a time, but there can be occasions that you will allow the user to select multiple items. A scroll bar can be placed either horizontally or vertically to allow the user to easily look through all the items available.
Ligne 29: Ligne 29:
 Notre projet consistera en une fenêtre principale et sept cadres principaux qui regrouperont visuellement nos ensembles de widgets : Notre projet consistera en une fenêtre principale et sept cadres principaux qui regrouperont visuellement nos ensembles de widgets :
  
-    1. Le premier cadre sera très basique : il contient simplement différents labels, montrant les différentes options de relief. +    1. Le premier cadre sera très basique : il contient simplement différents labels, montrant les différentes options de mise en relief. 
-    2. Le second contiendra des boutons c'est plutôt simple aussi - qui utilisent différentes options de relief. +    2. Le second -plutôt simple égalementcontiendra des boutons qui utilisent ces mêmes options de relief. 
-    3. Dans ce cadre, nous aurons deux cases à cocher et un bouton qui peut les activer/désactiver, et qui enverront leur état (1 ou 0) à la fenêtre du terminal lorsqu'on clique dessus ou les active/désactive+    3. Dans ce cadre, nous aurons deux cases à cocher et un bouton qui inverse leur état par programmation. Elles renverront cet état (1 ou 0) à la fenêtre du terminal lorsqu'elles sont cliquées ou que le bouton est actionné
-    4. Ensuite, nous aurons deux groupes de trois boutons radiochacun envoyant un message à la fenêtre du terminal lorsqu'on clique dessus. Chaque groupe est indépendant de l'autre.+    4. Ensuite, nous aurons deux groupes indépendants de trois boutons radio envoyant chacun un message à la fenêtre du terminal lorsqu'on clique dessus.
     5. Celui-ci contient des champs de texte qui ne sont pas nouveaux pour vous, mais il y a aussi un bouton pour activer et désactiver l'un d'eux. Lorsqu'il est désactivé, aucune saisie ne peut y être faite.     5. Celui-ci contient des champs de texte qui ne sont pas nouveaux pour vous, mais il y a aussi un bouton pour activer et désactiver l'un d'eux. Lorsqu'il est désactivé, aucune saisie ne peut y être faite.
     6. Celui-ci contient une liste avec une barre de défilement verticale qui envoie un message au terminal à chaque fois qu'un élément est sélectionné ; il aura deux boutons. Un bouton va effacer la zone de liste et l'autre la remplira avec des valeurs fictives.     6. Celui-ci contient une liste avec une barre de défilement verticale qui envoie un message au terminal à chaque fois qu'un élément est sélectionné ; il aura deux boutons. Un bouton va effacer la zone de liste et l'autre la remplira avec des valeurs fictives.
Ligne 63: Ligne 63:
 **The first two lines (comments) are the name of the application and what we are concentrating on in this part. Line three is our import statement. Then we define our class. The next line starts our <nowiki>__init__</nowiki> routine, which you all should be familiar with by now, but, if you are just joining us, it's the code that gets run when we instantiate the routine in the main portion of the program. We are passing it the Toplevel or root window, which comes in as master here. The last three lines (so far), call three different routines. The first (DefineVars) will set up various variables we'll need as we go. The next (BuildWidgets) will be where we define our widgets, and the last (PlaceWidgets) is where we actually place the widgets into the root window. As we did last time, we'll be using the grid geometry manager. Notice that BuildWidgets will return the object “f” (which is our root window), and we'll pass that along to the PlaceWidgets routine.** **The first two lines (comments) are the name of the application and what we are concentrating on in this part. Line three is our import statement. Then we define our class. The next line starts our <nowiki>__init__</nowiki> routine, which you all should be familiar with by now, but, if you are just joining us, it's the code that gets run when we instantiate the routine in the main portion of the program. We are passing it the Toplevel or root window, which comes in as master here. The last three lines (so far), call three different routines. The first (DefineVars) will set up various variables we'll need as we go. The next (BuildWidgets) will be where we define our widgets, and the last (PlaceWidgets) is where we actually place the widgets into the root window. As we did last time, we'll be using the grid geometry manager. Notice that BuildWidgets will return the object “f” (which is our root window), and we'll pass that along to the PlaceWidgets routine.**
  
-Les deux premières lignes (commentaires) sont le nom de l'application et le thème de cette partie. La ligne trois est notre déclaration d'importation. Ensuite, nous définissons notre classe. La ligne suivante commence notre routine <nowiki>__init__</nowiki>, avec laquelle vous devriez tous être familiers maintenant ; mais si vous venez juste de nous rejoindre, c'est le code qui est exécuté quand on instancie la routine dans la partie principale du programme. Nous lui passons la fenêtre racine (ou toplevel), qui s'appelle « principale » ici. Les trois dernières lignes (jusqu'à présent) appelent trois routines différentes. La première (DefinirVariables) réglera différentes variables dont nous aurons besoin plus tard. La suivante (ConstruireWidgets) sera l'endroit où nous définissons nos widgets, et la dernière (PlacerWidgets) est celle où nous allons placer les widgets dans la fenêtre racine. Comme nous l'avons fait la dernière fois, nous allons utiliser le gestionnaire de géométrie « grille ». Notez que ConstruireWidgets retournera l'objet « f » (qui est notre fenêtre racine) et que nous le passerons à la routine PlacerWidgets.+Les deux premières lignes (commentaires) sont le nom de l'application et le thème de cette partie. La ligne trois est notre déclaration d'importation. Ensuite, nous définissons notre classe. La ligne suivante commence notre routine <nowiki>__init__</nowiki>, avec laquelle vous devriez tous être familiers maintenant ; mais si vous venez juste de nous rejoindre, c'est le code qui est exécuté quand on instancie la routine dans la partie principale du programme. Nous lui passons la fenêtre racine (ou toplevel), qui s'appelle « principale » ici. Les trois dernières lignes (jusqu'à présent) appellent trois routines différentes. La première (DefinirVariables) réglera différentes variables dont nous aurons besoin plus tard. La suivante (ConstruireWidgets) sera l'endroit où nous définissons nos widgets, et la dernière (PlacerWidgets) est celle où nous allons placer les widgets dans la fenêtre racine. Comme nous l'avons fait la dernière fois, nous allons utiliser le gestionnaire de géométrie « grille ». Notez que ConstruireWidgets retournera l'objet « f » (qui est notre fenêtre racine) que nous passerons à la routine PlacerWidgets.
  
 **   def BuildWidgets(self,master): **   def BuildWidgets(self,master):
Ligne 87: Ligne 87:
         fenetre = Frame(principale)         fenetre = Frame(principale)
         # labels (ou etiquettes)         # labels (ou etiquettes)
-        self.fenetreLabels = Frame(fenetre,relief = SUNKEN,padx = 3, pady = 3,+        self.cadreLabels = Frame(fenetre,relief = SUNKEN,padx = 3, pady = 3,
                                    borderwidth = 2, width = 500)                                    borderwidth = 2, width = 500)
-        self.lbl1 = Label(self.fenetreLabels,text="Label plat",relief = FLAT,+        self.lbl1 = Label(self.cadreLabels,text="Label plat",relief = FLAT,
                                    width = 13,borderwidth = 2)                                    width = 13,borderwidth = 2)
-        self.lbl2 = Label(self.fenetreLabels,text="Label creux", relief = SUNKEN,+        self.lbl2 = Label(self.cadreLabels,text="Label creux", relief = SUNKEN,
                                    width = 13, borderwidth = 2)                                    width = 13, borderwidth = 2)
-        self.lbl3 = Label(self.fenetreLabels,text="Label arete", relief = RIDGE, width = 13,+        self.lbl3 = Label(self.cadreLabels,text="Label arete", relief = RIDGE, width = 13,
                           borderwidth = 2)                           borderwidth = 2)
-        self.lbl4 = Label(self.fenetreLabels,text="Label souleve", relief = RAISED,+        self.lbl4 = Label(self.cadreLabels,text="Label souleve", relief = RAISED,
                           width = 13, borderwidth = 2)                           width = 13, borderwidth = 2)
-        self.lbl5 = Label(self.fenetreLabels,text="Label rainure", relief = GROOVE,+        self.lbl5 = Label(self.cadreLabels,text="Label rainure", relief = GROOVE,
                           width = 13, borderwidth = 2)                           width = 13, borderwidth = 2)
         return fenetre         return fenetre
Ligne 105: Ligne 105:
 So, first we define our master frame. This is where we will be putting the rest of our widgets. Next, we define a child (of the master frame) frame that will hold five labels, and call it lblframe. We set the various attributes of the frame here. We set the relief to 'SUNKEN', a padding of 3 pixels on left and right (padx), and 3 pixels on the top and bottom (pady). We also set the borderwidth to 2 pixels so that its sunken relief is noticeable. By default, the borderwidth is set to 0, and the effect of being sunken won't be noticed. Finally, we set the total width of the frame to 500 pixels.** So, first we define our master frame. This is where we will be putting the rest of our widgets. Next, we define a child (of the master frame) frame that will hold five labels, and call it lblframe. We set the various attributes of the frame here. We set the relief to 'SUNKEN', a padding of 3 pixels on left and right (padx), and 3 pixels on the top and bottom (pady). We also set the borderwidth to 2 pixels so that its sunken relief is noticeable. By default, the borderwidth is set to 0, and the effect of being sunken won't be noticed. Finally, we set the total width of the frame to 500 pixels.**
  
-Voici notre routine ConstruireWidgets. Les lignes qui commence par « self. » ont été coupées pour deux raisons. Tout d'abord, c'est une bonne pratique de garder la longueur de la ligne à moins de 80 caractères. Deuxièmement, cela facilite les choses pour notre merveilleux éditeur. Vous vez deux possibilités : soit écrire des lignes longues, soit les garder comme ça. Python nous permet de couper les lignes tant qu'elles sont dans des parenthèses ou des crochets. Comme je l'ai dit précédemment, nous définissons les widgets avant de les placer dans la grille. Quand nous écrirons la routine suivante, vous remarquerez que nous pouvons aussi définir un widget au moment où nous le plaçons dans la grille, mais le définir avant de le mettre dans la grille dans une routine comme celle-ci facilite les choses, puisque nous faisons (la plupartdes définitions dans cette routine.+Voici notre routine ConstruireWidgets. Les lignes qui commence par « self. » ont été coupées pour deux raisons. Tout d'abord, c'est une bonne pratique de garder la longueur de la ligne à moins de 80 caractères. Deuxièmement, cela facilite les choses pour notre merveilleux éditeur. Vous avez deux possibilités : soit écrire des lignes longues, soit les garder comme ça. Python nous permet de couper les lignes tant qu'elles sont entre des parenthèses ou des crochets. Comme je l'ai dit précédemment, nous définissons les widgets avant de les placer dans la grille. Quand nous écrirons la routine suivante, vous remarquerez que nous pouvons aussi en définir un au moment où nous le plaçons mais le faire dans une routine séparée clarifie les choses, puisque nous y regroupons la plupart des définitions.
  
-Nous définissons donc d'abord notre fenêtre principale. C'est là que nous mettrons le reste de nos widgets. Ensuite, nous définissons une fenêtre fille (de la fenêtre principale), qui contiendra cinq étiquettes, et l'appelons fenetreLabels. Nous réglons les différents attributs de la fenêtre ici. Nous réglons le relief à « en creux » (« SUNKEN »), un remplissage de 3 pixels à gauche et à droite (padx), et de 3 pixels en haut et en bas (pady). Nous avons également mis la largeur de bordure à 2 pixels de telle sorte que son relief en creux soit perceptible. Par défaut, la largeur de bordure vaut 0 et l'effet de creux ne serait pas visible. Enfin, nous avons mis la largeur totale de la fenêtre à 500 pixels.+Nous définissons donc d'abord notre fenêtre principale. C'est là que nous mettrons le reste de nos widgets. Ensuite, nous définissons une cadre fils (de la fenêtre principale), qui contiendra cinq étiquettes, et l'appelons cadreLabels. Nous réglons les différents attributs du cadre ici. Nous réglons le relief à « en creux » (« SUNKEN »), une marge de 3 pixels à gauche et à droite (padx), et de 3 pixels en haut et en bas (pady). Nous avons également mis la largeur de bordure à 2 pixels de telle sorte que son relief en creux soit perceptible. Par défaut, la largeur de bordure vaut 0 et l'effet de creux ne serait pas visible. Enfin, nous avons mis la largeur totale du cadre à 500 pixels.
  
 **Next, we define each label widget that we will use. We set the parent as self.lblframe, and not to frame. This way all the labels are children of lblframe, and lblframe is a child of frame. Notice that each definition is pretty much the same for all five of the labels except the name of the widget (lbl1, lbl2, etc), the text, and the relief or visual effect. Finally, we return the frame back to the calling routine (<nowiki>__init__</nowiki>). **Next, we define each label widget that we will use. We set the parent as self.lblframe, and not to frame. This way all the labels are children of lblframe, and lblframe is a child of frame. Notice that each definition is pretty much the same for all five of the labels except the name of the widget (lbl1, lbl2, etc), the text, and the relief or visual effect. Finally, we return the frame back to the calling routine (<nowiki>__init__</nowiki>).
Ligne 127: Ligne 127:
        self.lbl5.grid(column = 5, row = 0, padx = 3, pady = 5)**        self.lbl5.grid(column = 5, row = 0, padx = 3, pady = 5)**
  
-Ensuite, nous définissons chaque widget étiquette que nous allons utiliser. Nous fixons le parent à self.fenetreLabels, et non pas fenetre. De cette façon, toutes les étiquettes sont des enfants de fenetreLabels et fenetreLabels est un enfant de fenetre. Remarquez que chaque définition est à peu près semblable pour l'ensemble des cinq étiquettes, sauf le nom du widget (lbl1, lbl2, etc), le texte et le relief ou l'effet visuel. Enfin, nous retournons la fenêtre à la routine appelante (<nowiki>__init__</ nowiki>).+Ensuite, nous définissons chaque widget étiquette que nous allons utiliser. Nous fixons le parent à self.cadreLabels, et non pas fenetre. De cette façon, toutes les étiquettes sont des enfants de cadreLabels qui lui-même est un enfant de fenetre. Remarquez que chaque définition est à peu près semblable pour l'ensemble des cinq étiquettes, sauf le nom du widget (lbl1, lbl2, etc), le texte et le relief ou effet visuel. Enfin, nous retournons la fenêtre à la routine appelante (<nowiki>__init__</ nowiki>).
  
 Voici notre routine PlacerWidgets... Voici notre routine PlacerWidgets...
Ligne 136: Ligne 136:
         fenetre.grid(column = 0, row = 0)         fenetre.grid(column = 0, row = 0)
         # place les labels         # place les labels
-        self.fenetreLabels.grid(column = 0, row = 1, padx = 5, pady = 5,+        self.cadreLabels.grid(column = 0, row = 1, padx = 5, pady = 5,
                                 columnspan = 5,sticky='WE')                                 columnspan = 5,sticky='WE')
-        l = Label(self.fenetreLabels,text='Labels |',width=15,+        l = Label(self.cadreLabels,text='Labels |',width=15,
                   anchor='e').grid(column=0,row=0)                   anchor='e').grid(column=0,row=0)
         self.lbl1.grid(column = 1, row = 0, padx = 3, pady = 5)         self.lbl1.grid(column = 1, row = 0, padx = 3, pady = 5)
Ligne 150: Ligne 150:
 Next, we lay out all of our other labels in the grid - starting at column 1, row 0.** Next, we lay out all of our other labels in the grid - starting at column 1, row 0.**
  
-Nous récupérons l'objet fenêtre en tant que paramètre appelé « principale ». Nous l'assignons à « fenetre » simplement pour être cohérent avec ce que nous avons fait dans la routine ConstruireWidgets. Ensuite, nous mettons en place la grille principale (fenetre.grid (colonnes = 0, row = 0)). Si nous ne faisons pas cela, rien ne fonctionnera correctement. Ensuite, nous commençons à mettre nos widgets dans les emplacements de la grille. D'abord nous mettons la fenêtre (fenetreLabels) qui contient toutes nos étiquettes et définissons ses attributs. Nous la plaçons colonne 0, ligne 1, réglons le remplissage à 5 pixels sur tous les côtés, lui disons de s'étaler sur 5 colonnes (à droite et à gauche), et enfin utilisons l'attribut « sticky » [Ndt : collant] pour forcer la fenêtre à s'étendre complètement à gauche et à droite (« WE » pour Ouest et Est). Maintenant vient la partie qui casse la règle dont je vous ai parlé. Nous mettons une étiquette comme premier widget dans la fenêtre, mais nous ne l'avons pas défini à l'avance : nous le définissons maintenant. Nous avons mis comme parent fenetreLabels, tout comme les autres étiquettes. Nous réglons le texte à « Labels |", la largeur à 15, et l'ancre à Est ('e'). Si vous vous souvenez de la dernière fois, en utilisant l'attribut d'ancrage, nous pouvons choisir où le texte s'affiche dans le widget. Dans ce cas, c'est le long du bord droit. Maintenant la partie amusante. Ici, nous définissons l'emplacement de la grille (et tous les autres attributs de la grille dont nous avons besoin), simplement en ajoutant « .grid » à la fin de la définition des étiquettes.+Nous récupérons l'objet fenêtre en tant que paramètre appelé « principale ». Nous l'assignons à « fenetre » simplement pour être cohérent avec ce que nous avons fait dans la routine ConstruireWidgets. Ensuite, nous mettons en place la grille principale (fenetre.grid (column=0, row=0)). Si nous ne faisons pas cela, rien ne fonctionnera correctement. Ensuite, nous commençons à mettre nos widgets dans les emplacements de la grille. D'abord nous mettons le cadre (cadreLabels) qui contient toutes nos étiquettes et définissons ses attributs. Nous le plaçons colonne 0, ligne 1, réglons la marge à 5 pixels sur tous les côtés, lui disons de s'étaler sur 5 colonnes (à droite et à gauche), et enfin utilisons l'attribut « sticky » [Ndt : collant] pour forcer la fenêtre à s'étendre complètement à gauche et à droite (« WE » pour Ouest et Est). Maintenant vient la partie qui casse la règle dont je vous ai parlé. Nous mettons une étiquette comme premier widget dans la fenêtre, mais nous ne l'avons pas défini à l'avance : nous le faisons maintenant. Nous avons mis comme parent cadreLabels, tout comme les autres étiquettes. Nous réglons le texte à « Labels | », la largeur à 15, et l'ancrage à Est ('e'). Si vous vous souvenez de la dernière fois, en utilisant l'attribut d'ancrage, nous pouvons choisir où le texte s'affiche dans le widget. Dans ce cas, c'est le long du bord droit. Maintenant la partie amusante. Ici, nous définissons l'emplacement de la grille (et tous les autres attributs de la grille dont nous avons besoin), simplement en ajoutant « .grid » à la fin de la définition des étiquettes.
  
 Ensuite, nous plaçons toutes nos autres étiquettes dans la grille, à partir de la colonne 1, ligne 0. Ensuite, nous plaçons toutes nos autres étiquettes dans la grille, à partir de la colonne 1, ligne 0.
Ligne 186: Ligne 186:
 Now save what you have as widgetdemo1a.py, and let's add some buttons. Since we built our base program to be added to, we'll simply add the parts that apply. Let's start with the BuildWidgets routine. After the labels definitions, and before the “return frame” line, add the following...** Now save what you have as widgetdemo1a.py, and let's add some buttons. Since we built our base program to be added to, we'll simply add the parts that apply. Let's start with the BuildWidgets routine. After the labels definitions, and before the “return frame” line, add the following...**
  
-D'abord, on instancie une instance de Tk. Puis nous définissons la taille de la fenêtre principale à 750 pixels de large sur 40 pixels de haut et la localisons à 150 pixels de la gauche et du haut de l'écran. Puis nous réglons le titre de la fenêtre et instancions notre objet Demo et, enfin, appelons la boucle principale de Tk.+D'abord, on crée une instance de Tk. Puis nous définissons la taille de la fenêtre principale à 750 pixels de large sur 40 pixels de haut et la localisons à 150 pixels de la gauche et du haut de l'écran. Puis nous réglons le titre de la fenêtre et instancions notre objet Demo et, enfin, appelons la boucle principale de Tk.
  
 Essayez. Vous devriez voir les cinq étiquettes ainsi que l'étiquette de « dernière minute » avec divers effets magnifiques. Essayez. Vous devriez voir les cinq étiquettes ainsi que l'étiquette de « dernière minute » avec divers effets magnifiques.
Ligne 192: Ligne 192:
 Les boutons Les boutons
  
-Maintenant, enregistrez ce que vous avez en tant que widgetdemo1a.py et nous allons ajouter quelques boutons. Puisque nous avons construit notre programme de base ainsi, nous allons simplement pouvoir y ajouter les parties qui manquent. Commençons par la routine ConstruireWidgets. Après les définitions des étiquettes, et avant le « return fenetre », ajoutez ce qui suit...+Maintenant, enregistrez ce que vous avez en tant que widgetdemo1a.py et nous ajoutons quelques boutons. Puisque nous avons construit notre programme de base ainsi, nous allons simplement pouvoir y ajouter les parties qui manquent. Commençons par la routine ConstruireWidgets. Après les définitions des étiquettes, et avant le « return fenetre », ajoutez ce qui suit...
  
 **       # Buttons **       # Buttons
Ligne 214: Ligne 214:
  
         # boutons         # boutons
-        self.fenetreBoutons = Frame(fenetre,relief = SUNKEN,padx = 3,+        self.cadreBoutons = Frame(fenetre,relief = SUNKEN,padx = 3,
                                     pady = 3, borderwidth = 2, width = 500)                                     pady = 3, borderwidth = 2, width = 500)
-        self.btn1 = Button(self.fenetreBoutons,text="Bouton plat",+        self.btn1 = Button(self.cadreBoutons,text="Bouton plat",
                            relief = FLAT, borderwidth = 2)                            relief = FLAT, borderwidth = 2)
-        self.btn2 = Button(self.fenetreBoutons,text="Bouton creux",+        self.btn2 = Button(self.cadreBoutons,text="Bouton creux",
                            relief = SUNKEN, borderwidth = 2)                            relief = SUNKEN, borderwidth = 2)
-        self.btn3 = Button(self.fenetreBoutons,text="Bouton arete",+        self.btn3 = Button(self.cadreBoutons,text="Bouton arete",
                            relief = RIDGE, borderwidth = 2)                            relief = RIDGE, borderwidth = 2)
-        self.btn4 = Button(self.fenetreBoutons,text="Bouton souleve",+        self.btn4 = Button(self.cadreBoutons,text="Bouton souleve",
                            relief = RAISED, borderwidth = 2)                            relief = RAISED, borderwidth = 2)
-        self.btn5 = Button(self.fenetreBoutons,text="Bouton rainure",+        self.btn5 = Button(self.cadreBoutons,text="Bouton rainure",
                            relief = GROOVE, borderwidth = 2)                            relief = GROOVE, borderwidth = 2)
         self.btn1.bind('<ButtonRelease-1>',lambda e: self.clicBouton(1))         self.btn1.bind('<ButtonRelease-1>',lambda e: self.clicBouton(1))
Ligne 246: Ligne 246:
 Rien de bien nouveau ici. Nous avons défini les boutons avec leurs attributs et avons fixé leurs fonctions de rappel avec un « .bind ». Notez que nous utilisons lambda pour envoyer les valeurs 1 à 5 suivant le bouton sur lequel on clique. Dans la fonction de rappel, nous allons utiliser cela afin de savoir quel bouton on doit gérer. Maintenant, nous allons travailler dans la routine PlacerWidgets. Placez le code suivant juste après l'emplacement de la dernière étiquette : Rien de bien nouveau ici. Nous avons défini les boutons avec leurs attributs et avons fixé leurs fonctions de rappel avec un « .bind ». Notez que nous utilisons lambda pour envoyer les valeurs 1 à 5 suivant le bouton sur lequel on clique. Dans la fonction de rappel, nous allons utiliser cela afin de savoir quel bouton on doit gérer. Maintenant, nous allons travailler dans la routine PlacerWidgets. Placez le code suivant juste après l'emplacement de la dernière étiquette :
         # place les boutons         # place les boutons
-        self.fenetreBoutons.grid(column=0, row = 2, padx = 5,+        self.cadreBoutons.grid(column=0, row = 2, padx = 5,
                                  pady = 5, columnspan = 5,sticky = 'WE')                                  pady = 5, columnspan = 5,sticky = 'WE')
-        l = Label(self.fenetreBoutons,text='Boutons |',width=15,+        l = Label(self.cadreBoutons,text='Boutons |',width=15,
                   anchor='e').grid(column=0,row=0)                   anchor='e').grid(column=0,row=0)
         self.btn1.grid(column = 1, row = 0, padx = 3, pady = 3)         self.btn1.grid(column = 1, row = 0, padx = 3, pady = 3)
Ligne 301: Ligne 301:
 Les cases à cocher Les cases à cocher
  
-Comme je l'ai dit précédemment, cette partie de la démo a un bouton normal et deux cases à cocher. L'apparence de la première case est celle, normale, à laquelle vous pouvez vous attendre. La seconde est plus comme un « bouton collant » - quand elle n'est pas sélectionnée (ou cochée)​​, elle ressemble à un bouton normal. Lorsque vous la sélectionnez, elle ressemble à un bouton qui reste enfoncé. Nous pouvons faire cela simplement en définissant l'attribut indicatoron à False. Le bouton « normal » permet de basculer les cases de « cochées » à « décochées » et vice versa, à chaque fois que l'on clique dessus. Nous arrivons à programmer cela en appelant la méthode .toggle liée à la case à cocher. Nous relions l'événement clic gauche de la souris (lorsque le bouton est relâché) à une fonction afin de pouvoir envoyer un message (dans notre cas) au terminal. En plus de tout cela, nous mettons en place deux variables (une pour chacune des cases à cocher) que l'on peut interroger à tout moment. Ici, nous interrogeons ces valeurs et les affichons à chaque fois qu'une case est cliquée. Faites attention à la partie variable du code : elle est utilisée dans de nombreux widgets.+Comme je l'ai dit précédemment, cette partie de la démo a un bouton normal et deux cases à cocher. L'apparence de la première case est celle à laquelle vous vous attendez normalement. La seconde est plus comme un « bouton collant » - quand elle n'est pas sélectionnée (ou cochée)??, elle ressemble à un bouton normal. Lorsque vous la sélectionnez, elle ressemble à un bouton qui reste enfoncé. Nous pouvons faire cela simplement en définissant l'attribut indicatoron à False. Le bouton « normal » permet de basculer les cases de « cochées » à « décochées » et vice versa, à chaque fois que l'on clique dessus. Nous arrivons à programmer cela en appelant la méthode .toggle liée à la case à cocher. Nous relions l'événement clic gauche de la souris (lorsque le bouton est relâché) à une fonction afin de pouvoir envoyer un message (dans notre cas) au terminal. En plus de tout cela, nous mettons en place deux variables (une pour chacune des cases à cocher) que l'on peut interroger à tout moment. Ici, nous interrogeons ces valeurs et les affichons à chaque fois qu'une case est cliquée. Faites attention à la partie variable du code : elle est utilisée dans de nombreux widgets.
  
 **Under the BuildWidget routine, after the button code we just put in and before the return statement, put the following code: **Under the BuildWidget routine, after the button code we just put in and before the return statement, put the following code:
Ligne 318: Ligne 318:
 Dans la routine ConstruireWidgets, après le code des boutons que nous venons d'ajouter et avant l'instruction de retour, placez le code suivant : Dans la routine ConstruireWidgets, après le code des boutons que nous venons d'ajouter et avant l'instruction de retour, placez le code suivant :
         # checkbox (ou cases a cocher)         # checkbox (ou cases a cocher)
-        self.fenetreCases = Frame(fenetre, relief = SUNKEN, padx = 3, pady = 3,+        self.cadreCases = Frame(fenetre, relief = SUNKEN, padx = 3, pady = 3,
                                   borderwidth = 2, width = 500)                                   borderwidth = 2, width = 500)
-        self.chk1 = Checkbutton(self.fenetreCases, text = "Case a cocher normale",+        self.chk1 = Checkbutton(self.cadreCases, text = "Case a cocher normale",
                                 variable=self.Chk1Val)                                 variable=self.Chk1Val)
-        self.chk2 = Checkbutton(self.fenetreCases, text = "Case a cocher",+        self.chk2 = Checkbutton(self.cadreCases, text = "Case a cocher",
                                 variable=self.Chk2Val,indicatoron = False)                                 variable=self.Chk2Val,indicatoron = False)
         self.chk1.bind('<ButtonRelease-1>',lambda e: self.clicCases(1))         self.chk1.bind('<ButtonRelease-1>',lambda e: self.clicCases(1))
         self.chk2.bind('<ButtonRelease-1>',lambda e: self.clicCases(2))         self.chk2.bind('<ButtonRelease-1>',lambda e: self.clicCases(2))
-        self.btnInverserCases = Button(self.fenetreCases,text="Inverser cases")+        self.btnInverserCases = Button(self.cadreCases,text="Inverser cases")
         self.btnInverserCases.bind('<ButtonRelease-1>',self.btnInverser)         self.btnInverserCases.bind('<ButtonRelease-1>',self.btnInverser)
  
Ligne 339: Ligne 339:
        self.chk2.grid(column = 3, row = 0, padx = 3, pady = 3)**        self.chk2.grid(column = 3, row = 0, padx = 3, pady = 3)**
  
-Encore une fois, vous avez vu tout cela avant. Nous créons la fenêtre pour contenir nos widgets. Nous créons un bouton et deux cases à cocher. Plaçons-les maintenant : +Encore une fois, vous avez vu tout cela avant. Nous créons le cadre pour contenir nos widgets. Nous créons un bouton et deux cases à cocher. Plaçons-les maintenant : 
-        # place les cases cocher et le bouton d'inversion +        # place les cases à cocher et le bouton d'inversion 
-        self.fenetreCases.grid(column = 0, row = 3, padx = 5, pady = 5,+        self.cadreCases.grid(column = 0, row = 3, padx = 5, pady = 5,
                                columnspan = 5,sticky = 'WE')                                columnspan = 5,sticky = 'WE')
-        l = Label(self.fenetreCases,text='Cases cocher |',width=15,+        l = Label(self.cadreCases,text='Cases à cocher |',width=15,
                   anchor='e').grid(column=0,row=0)                   anchor='e').grid(column=0,row=0)
         self.btnInverserCases.grid(column = 1, row = 0, padx = 3, pady = 3)                            self.btnInverserCases.grid(column = 1, row = 0, padx = 3, pady = 3)                   
Ligne 374: Ligne 374:
         self.chk1.toggle()         self.chk1.toggle()
         self.chk2.toggle()         self.chk2.toggle()
-        print("Valeur de la case cocher 1 : {0}".format(self.Chk1Val.get())) +        print("Valeur de la case à cocher 1 : {0}".format(self.Chk1Val.get())) 
-        print("Valeur de la case cocher 2 : {0}".format(self.Chk2Val.get()))        +        print("Valeur de la case à cocher 2 : {0}".format(self.Chk2Val.get()))        
  
 **And finally replace the geometry statement with this... **And finally replace the geometry statement with this...
Ligne 411: Ligne 411:
 Retournez dans ConstruireWidgets, et ajoutez le code suivant juste avant l'instruction de retour : Retournez dans ConstruireWidgets, et ajoutez le code suivant juste avant l'instruction de retour :
         # boutons radio         # boutons radio
-        self.fenetreBoutonsRadio = Frame(fenetre, relief = SUNKEN, padx = 3, pady = 3, borderwidth = 2, width = 500) +        self.cadreBoutonsRadio = Frame(fenetre, relief = SUNKEN, padx = 3, pady = 3, borderwidth = 2, width = 500) 
-        self.rb1 = Radiobutton(self.fenetreBoutonsRadio, text = "Radio 1", variable = self.RBVal, value = 1) +        self.rb1 = Radiobutton(self.cadreBoutonsRadio, text = "Radio 1", variable = self.RBVal, value = 1) 
-        self.rb2 = Radiobutton(self.fenetreBoutonsRadio, text = "Radio 2", variable = self.RBVal, value = 2) +        self.rb2 = Radiobutton(self.cadreBoutonsRadio, text = "Radio 2", variable = self.RBVal, value = 2) 
-        self.rb3 = Radiobutton(self.fenetreBoutonsRadio, text = "Radio 3", variable = self.RBVal, value = 3)+        self.rb3 = Radiobutton(self.cadreBoutonsRadio, text = "Radio 3", variable = self.RBVal, value = 3)
         self.rb1.bind('<ButtonRelease-1>',lambda e: self.clicBoutonRadio())         self.rb1.bind('<ButtonRelease-1>',lambda e: self.clicBoutonRadio())
         self.rb2.bind('<ButtonRelease-1>',lambda e: self.clicBoutonRadio())         self.rb2.bind('<ButtonRelease-1>',lambda e: self.clicBoutonRadio())
         self.rb3.bind('<ButtonRelease-1>',lambda e: self.clicBoutonRadio())         self.rb3.bind('<ButtonRelease-1>',lambda e: self.clicBoutonRadio())
-        self.rb4 = Radiobutton(self.fenetreBoutonsRadio, text = "Radio 4", variable = self.RBVal2, value = "1-1"+        self.rb4 = Radiobutton(self.cadreBoutonsRadio, text = "Radio 4", variable = self.RBVal2, value = "1-1"
-        self.rb5 = Radiobutton(self.fenetreBoutonsRadio, text = "Radio 5", variable = self.RBVal2, value = "1-2"+        self.rb5 = Radiobutton(self.cadreBoutonsRadio, text = "Radio 5", variable = self.RBVal2, value = "1-2"
-        self.rb6 = Radiobutton(self.fenetreBoutonsRadio, text = "Radio 6", variable = self.RBVal2, value = "1-3")+        self.rb6 = Radiobutton(self.cadreBoutonsRadio, text = "Radio 6", variable = self.RBVal2, value = "1-3")
         self.rb4.bind('<ButtonRelease-1>',lambda e: self.clicBoutonRadio2())         self.rb4.bind('<ButtonRelease-1>',lambda e: self.clicBoutonRadio2())
         self.rb5.bind('<ButtonRelease-1>',lambda e: self.clicBoutonRadio2())         self.rb5.bind('<ButtonRelease-1>',lambda e: self.clicBoutonRadio2())
Ligne 445: Ligne 445:
 Ajoutez ceci dans PlacerWidgets : Ajoutez ceci dans PlacerWidgets :
         # place les boutons radio et selectionne le premier         # place les boutons radio et selectionne le premier
-        self.fenetreBoutonsRadio.grid(column = 0, row = 4, padx = 5, pady = 5, columnspan = 5,sticky = 'WE'+        self.cadreBoutonsRadio.grid(column = 0, row = 4, padx = 5, pady = 5, columnspan = 5,sticky = 'WE'
-        l = Label(self.fenetreBoutonsRadio,+        l = Label(self.cadreBoutonsRadio,
                   text='Boutons radio |',                   text='Boutons radio |',
                   width=15,anchor='e').grid(column=0,row=0)                   width=15,anchor='e').grid(column=0,row=0)
Ligne 453: Ligne 453:
         self.rb3.grid(column = 4, row = 0, padx = 3, pady = 3, sticky = 'WE')         self.rb3.grid(column = 4, row = 0, padx = 3, pady = 3, sticky = 'WE')
         self.RBVal.set("1"                self.RBVal.set("1"       
-        l = Label(self.fenetreBoutonsRadio,text='| Un autre groupe |',+        l = Label(self.cadreBoutonsRadio,text='| Un autre groupe |',
                   width = 15,                   width = 15,
                   anchor = 'e').grid(column = 5, row = 0)                   anchor = 'e').grid(column = 5, row = 0)
Ligne 499: Ligne 499:
        self.btnDisable.bind('<ButtonRelease-1>', self.btnDisableClick)**        self.btnDisable.bind('<ButtonRelease-1>', self.btnDisableClick)**
  
-Enregistrez le projet sous widgetdemo1d.pyet exécutez-le. Maintenant, nous allons travailler sur les champs de texte standard (ou widgets de saisie).+Enregistrez le projet sous widgetdemo1d.py et exécutez-le. Maintenant, nous allons travailler sur les champs de texte standard (ou widgets de saisie).
  
 Les champs de texte Les champs de texte
  
-Encore une fois, nous avons déjà utilisé des champs de texte (ou widgets de saisie) dans diverses interfaces graphiques auparavant. Mais cette fois, comme je l'ai dit précédemment, nous allons montrer comment empêcher l'utilisateur de faire des changements dans le champ de texte en le désactivant. Cela s'avère utile si vous affichez certaines donnéeset permettez à l'utilisateur de les modifier seulement quand il est dans un mode d'édition. À présent, vous devriez être assez sûr que la première chose que nous devons faire est d'ajouter du code à la routine ConstruireWidgets :+Encore une fois, nous avons déjà utilisé des champs de texte (ou widgets de saisie) dans diverses interfaces graphiques auparavant. Mais cette fois-ci, comme je l'ai dit précédemment, nous allons montrer comment empêcher l'utilisateur de faire des changements dans le champ texte en le désactivant. Cela s'avère utile si vous affichez certaines données et ne permettez à l'utilisateur de les modifier que lorsqu'il est dans le mode édition. À présent, vous devriez savoir que la première chose que nous devons faire est d'ajouter du code à la routine ConstruireWidgets :
         # champs de texte         # champs de texte
-        self.fenetreChampsTexte = Frame(fenetre, relief = SUNKEN, padx = 3, pady = 3, borderwidth = 2, width = 500) +        self.cadreChampsTexte = Frame(fenetre, relief = SUNKEN, padx = 3, pady = 3, borderwidth = 2, width = 500) 
-        self.txt1 = Entry(self.fenetreChampsTexte, width = 10) +        self.txt1 = Entry(self.cadreChampsTexte, width = 10) 
-        self.txt2 = Entry(self.fenetreChampsTexte, disabledbackground="#cccccc", width = 10) +        self.txt2 = Entry(self.cadreChampsTexte, disabledbackground="#cccccc", width = 10) 
-        self.btnDesactiver = Button(self.fenetreChampsTexte, text = "Activer/Desactiver")+        self.btnDesactiver = Button(self.cadreChampsTexte, text = "Activer/Desactiver")
         self.btnDesactiver.bind('<ButtonRelease-1>', self.clicBoutonDesactiver)         self.btnDesactiver.bind('<ButtonRelease-1>', self.clicBoutonDesactiver)
  
Ligne 524: Ligne 524:
 Ensuite, ajoutez le code à la routine PlacerWidgets : Ensuite, ajoutez le code à la routine PlacerWidgets :
         # place les champs de texte         # place les champs de texte
-        self.fenetreChampsTexte.grid(column = 0, row = 5, padx = 5, pady = 5, columnspan = 5,sticky = 'WE'+        self.cadreChampsTexte.grid(column = 0, row = 5, padx = 5, pady = 5, columnspan = 5,sticky = 'WE'
-        l = Label(self.fenetreChampsTexte,text='Champs de texte |',width=15, anchor='e').grid(column=0,row=0)+        l = Label(self.cadreChampsTexte,text='Champs de texte |',width=15, anchor='e').grid(column=0,row=0)
         self.txt1.grid(column = 2, row = 0, padx = 3, pady = 3)         self.txt1.grid(column = 2, row = 0, padx = 3, pady = 3)
         self.txt2.grid(column = 3, row = 0, padx = 3, pady = 3)         self.txt2.grid(column = 3, row = 0, padx = 3, pady = 3)
Ligne 553: Ligne 553:
             self.Disabled = False             self.Disabled = False
             self.txt2.configure(state='normal')             self.txt2.configure(state='normal')
 +
 +Reconfigurer les dimensions à :
 +root.geometry('750x270+150+150')
  
 **Save it as widgetdemo1d.py, and run it. **Save it as widgetdemo1d.py, and run it.
Ligne 576: Ligne 579:
  
 Ensuite nous allons travailler sur les listes. En commençant dans ConstruireWidgets, ajoutez le code suivant : Ensuite nous allons travailler sur les listes. En commençant dans ConstruireWidgets, ajoutez le code suivant :
-        # des choses pour la liste +        # Données pour la liste 
-        self.fenetreListe = Frame(fenetre,+        self.cadreListe = Frame(fenetre,
                                   relief = SUNKEN,                                   relief = SUNKEN,
                                   padx = 3,                                    padx = 3, 
Ligne 584: Ligne 587:
                                   width = 500                                   width = 500
         )         )
-        # boite avec barre de defilement pour la liste +        # boite avec barre de défilement pour la liste 
-        self.defilementV = Scrollbar(self.fenetreListe+        self.defilementV = Scrollbar(self.cadreListe
-        self.liste = Listbox(self.fenetreListe+        self.liste = Listbox(self.cadreListe
                              height = 5,                              height = 5,
                              yscrollcommand = self.defilementV.set)                              yscrollcommand = self.defilementV.set)
Ligne 613: Ligne 616:
         self.defilementV.config(command = self.liste.yview)         self.defilementV.config(command = self.liste.yview)
         self.btnEffacerListe = Button(         self.btnEffacerListe = Button(
-             self.fenetreListe,+             self.cadreListe,
              text = "Effacer liste",              text = "Effacer liste",
              command = self.effacerListe,              command = self.effacerListe,
Ligne 619: Ligne 622:
         )         )
         self.btnRemplirListe = Button(         self.btnRemplirListe = Button(
-             self.fenetreListe,+             self.cadreListe,
              text = "Remplir liste",              text = "Remplir liste",
              command = self.remplirListe,               command = self.remplirListe, 
Ligne 639: Ligne 642:
        self.btnFillLBox.grid(column = 1, row = 1, padx = 5)**        self.btnFillLBox.grid(column = 1, row = 1, padx = 5)**
  
-Comme d'habitude, nous créons notre fenêtre. Puis nous créons notre barre de défilement verticale. Nous faisons cela avant de créer la listeparce que nous devons faire référence à la méthode « .set » de la barre de défilement. Remarquez l'attribut « height = 5 ». Cela force la liste à montrer 5 éléments à la fois. Dans la déclaration .bind, nous utilisons « <<ListboxSelect>> » comme événement. C'est ce qu'on appelle un événement virtuel, puisque ce n'est pas vraiment un événement « officiel ».+Comme d'habitude, nous créons notre cadre. Puis nous créons notre barre de défilement verticale. Nous le faisons avant de créer la liste parce que nous devons faire référence à la méthode « .set » de la barre de défilement. Remarquez l'attribut « height = 5 ». Cela force la liste à montrer 5 éléments à la fois. Dans la déclaration .bind, nous utilisons « <<ListboxSelect>> » comme événement. C'est ce qu'on appelle un événement virtuel, puisque ce n'est pas vraiment un événement « officiel ».
  
 Maintenant, nous allons nous occuper du code supplémentaire dans la routine PlacerWidgets : Maintenant, nous allons nous occuper du code supplémentaire dans la routine PlacerWidgets :
         # place la liste et les boutons associes         # place la liste et les boutons associes
-        self.fenetreListe.grid(column = 0, row = 6, padx = 5, pady = 5, columnspan = 5,sticky = 'WE'+        self.cadreListe.grid(column = 0, row = 6, padx = 5, pady = 5, columnspan = 5,sticky = 'WE'
-        l = Label(self.fenetreListe,text='Liste |',width=15, anchor='e').grid(column=0,row=0,rowspan=2)+        l = Label(self.cadreListe,text='Liste |',width=15, anchor='e').grid(column=0,row=0,rowspan=2)
         self.liste.grid(column = 2, row = 0,rowspan=2)         self.liste.grid(column = 2, row = 0,rowspan=2)
         self.defilementV.grid(column = 3, row = 0,rowspan = 2, sticky = 'NSW')         self.defilementV.grid(column = 3, row = 0,rowspan = 2, sticky = 'NSW')
Ligne 689: Ligne 692:
  
     def listeSelection(self,p1):     def listeSelection(self,p1):
-        print("Clic sur un element de la liste")+        print("Clic sur un élément de la liste")
         items = self.liste.curselection()         items = self.liste.curselection()
         selitem = items[0]         selitem = items[0]
-        print("Index de l'element choisi : {0}".format(selitem)) +        print("Index de l'élément choisi : {0}".format(selitem)) 
-        print("Texte de l'element choisi : {0}".format(self.liste.get(selitem)))+        print("Texte de l'élément choisi : {0}".format(self.liste.get(selitem)))
  
 Enfin, mettez à jour la ligne de géométrie : Enfin, mettez à jour la ligne de géométrie :
Ligne 714: Ligne 717:
        self.btnMBYesNo.bind('<ButtonRelease-1>', lambda e: self.ShowMessageBox(5))**        self.btnMBYesNo.bind('<ButtonRelease-1>', lambda e: self.ShowMessageBox(5))**
  
-Sauvegarder cela dans widgetdemo1e.pyet exécutez-le. Maintenant, nous allons faire les dernières modifications à notre application.+Sauvegarder cela comme widgetdemo1e.py et exécutez-le. Maintenant, nous allons faire les dernières modifications à notre application.
  
 Les boîtes de dialogue Les boîtes de dialogue
  
-Cette section est tout simplement une série de boutons « normaux » qui appellent les différents types de boîtes de dialogue. Nous les avons déjà rencontrés avec une boîte à outils différente. Nous allons explorer seulement 5 types différents, mais il y en a plus. Dans cette section, nous allons regarder Information, Avertissement, Erreur, Question, et les dialogues Oui/Non. Ils sont très utiles lorsque vous avez besoin de faire passer des informations à votre utilisateur d'une manière assez importante. Dans la routine ConstruireWidgets, ajoutez...+Cette section est tout simplement une série de boutons « normaux » qui appellent les différents types de boîtes de dialogue. Nous les avons déjà rencontrés avec une boîte à outils différente. Nous allons explorer seulement 5 types différents, mais il y en a plus. Dans cette section, nous allons regarder Information, Avertissement, Erreur, Question, et Dialogue Oui/Non. Ils sont très utiles lorsque vous avez besoin de faire passer des informations à votre utilisateur d'une manière assez forte. Dans la routine ConstruireWidgets, ajoutez...
         # boutons pour afficher les fenetres de messages et de dialogues         # boutons pour afficher les fenetres de messages et de dialogues
-        self.fenetreMessages = Frame(fenetre,relief = SUNKEN,padx = 3, pady = 3, borderwidth = 2) +        self.cadreMessages = Frame(fenetre,relief = SUNKEN,padx = 3, pady = 3, borderwidth = 2) 
-        self.btnMBInfo = Button(self.fenetreMessages,text = "Info"+        self.btnMBInfo = Button(self.cadreMessages,text = "Info"
-        self.btnMBWarning = Button(self.fenetreMessages,text = "Avertissement"+        self.btnMBWarning = Button(self.cadreMessages,text = "Avertissement"
-        self.btnMBError = Button(self.fenetreMessages,text = "Erreur"+        self.btnMBError = Button(self.cadreMessages,text = "Erreur"
-        self.btnMBQuestion = Button(self.fenetreMessages,text = "Question"+        self.btnMBQuestion = Button(self.cadreMessages,text = "Question"
-        self.btnMBYesNo = Button(self.fenetreMessages,text = "Oui/Non")+        self.btnMBYesNo = Button(self.cadreMessages,text = "Oui/Non")
         self.btnMBInfo.bind('<ButtonRelease-1>', lambda e: self.afficheFenetreMessage(1))         self.btnMBInfo.bind('<ButtonRelease-1>', lambda e: self.afficheFenetreMessage(1))
         self.btnMBWarning.bind('<ButtonRelease-1>', lambda e: self.afficheFenetreMessage(2))         self.btnMBWarning.bind('<ButtonRelease-1>', lambda e: self.afficheFenetreMessage(2))
Ligne 743: Ligne 746:
  
 Maintenant ajoutez le code dans la routine PlacerWidgets : Maintenant ajoutez le code dans la routine PlacerWidgets :
-        # boutons de boites de messages et de dialogues +        # boutons de boîtes de messages et cadre 
-        self.fenetreMessages.grid(column = 0,row = 7, columnspan = 5, padx = 5, sticky = 'WE'+        self.cadreMessages.grid(column = 0,row = 7, columnspan = 5, padx = 5, sticky = 'WE'
-        l = Label(self.fenetreMessages,text='Messages |',width=15, anchor='e').grid(column=0,row=0)+        l = Label(self.cadreMessages,text='Messages |',width=15, anchor='e').grid(column=0,row=0)
         self.btnMBInfo.grid(column = 1, row = 0, padx= 3)         self.btnMBInfo.grid(column = 1, row = 0, padx= 3)
         self.btnMBWarning.grid(column = 2, row = 0, padx= 3)         self.btnMBWarning.grid(column = 2, row = 0, padx= 3)
Ligne 767: Ligne 770:
            print('{0} was pressed...'.format(resp))**            print('{0} was pressed...'.format(resp))**
  
-Voici la routine d'appui. Pour les trois premiers (Info, Avertissement et Erreur), il suffit d'appeler « tkMessageBox.showinfo », ou celui dont vous avez besoin, avec deux paramètres. Le premier est le titre de la boîte de messageet le second est le message réel que vous voulez montrer. L'icône est gérée pour vous par Tkinter. Pour les dialogues qui fournissent une réponse (Question, Oui/Non), nous fournissons une variable qui reçoit la valeur correspondant au bouton cliqué. Dans le cas de la boîte de dialogue Question, la réponse est « Oui » ou « Non », et dans le cas du dialogue Oui/Non, la réponse est « True » ou « False ».+Voici la routine d'appui. Pour les trois premiers (Info, Avertissement et Erreur), il suffit d'appeler « tkMessageBox.showinfo », ou celui dont vous avez besoin, avec deux paramètres. Le premier est le titre de la boîte de message et le second est le message réel que vous voulez montrer. L'icône est gérée pour vous par Tkinter. Pour les dialogues qui fournissent une réponse (Question, Oui/Non), nous fournissons une variable qui reçoit la valeur correspondant au bouton cliqué. Dans le cas de la boîte de dialogue Question, la réponse est « Oui » ou « Non », et dans le cas du dialogue Oui/Non, la réponse est « True » ou « False ».
     def afficheFenetreMessage(self,which):     def afficheFenetreMessage(self,which):
         if which == 1:         if which == 1:
Ligne 791: Ligne 794:
 That's it for this time. I hope this has inspired you to explore all of the goodies that tkinter provides. See you next time.** That's it for this time. I hope this has inspired you to explore all of the goodies that tkinter provides. See you next time.**
  
-Finalement, modifiez la ligne de géométrie :+Enfin, modifiez la ligne de géométrie :
   root.geometry('750x490+550+150')   root.geometry('750x490+550+150')
  
Ligne 798: Ligne 801:
 J'ai placé le code de widgetdemo1f.py sur pastebin ici : http://pastebin.com/TQgppVnF J'ai placé le code de widgetdemo1f.py sur pastebin ici : http://pastebin.com/TQgppVnF
  
-C'est tout pour cette fois. J'espère que ceci vous aura inspiré pour explorer toutes les fonctionnalités proposées par tkinter. À la prochaine fois.+C'est tout pour cette fois. J'espère que ceci vous aura inspiré à explorer toutes les fonctionnalités proposées par tkinter. À la prochaine fois.
  
issue52/tutopython.1317210558.txt.gz · Dernière modification : 2011/09/28 13:49 de auntiee