Outils pour utilisateurs

Outils du site


issue53: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
issue53:tutopython [2011/11/15 22:05] fredphil91issue53:tutopython [2011/11/17 16:00] (Version actuelle) majordom
Ligne 10: Ligne 10:
 Si vous avez déjà fait la queue pour acheter un billet de cinéma, vous avez été dans une file d'attente. Si vous avez jamais eu à attendre dans les bouchons aux heures de pointe, vous avez été dans une file d'attente. Si vous avez déjà attendu dans un bureau administratif avec l'un de ces petits billets qui dit que vous êtes le numéro 98 et le panneau qui affiche « Numéro actuel : 42 », vous avez été dans une file d'attente. Si vous avez déjà fait la queue pour acheter un billet de cinéma, vous avez été dans une file d'attente. Si vous avez jamais eu à attendre dans les bouchons aux heures de pointe, vous avez été dans une file d'attente. Si vous avez déjà attendu dans un bureau administratif avec l'un de ces petits billets qui dit que vous êtes le numéro 98 et le panneau qui affiche « Numéro actuel : 42 », vous avez été dans une file d'attente.
  
-Dans le monde des ordinateurs, les files d'attente sont très répandues. En tant qu'utilisateur, la plupart du temps vous n'avez pas à vous en préoccuper. Elles sont invisibles pour l'utilisateur. Mais si jamais vous avez à faire face aux événements en temps réel, vous allez finir par avoir à traiter avec elles. Il s'agit simplement de données d'un type ou d'un autre, qui attendent dans la file leur tour d'être traitées. Une fois qu'elles sont dans la file, elles attendent jusqu'à être traitées puis disparaissent. Vous ne pouvez pas connaître la valeur de l'élément de donnée suivant, sauf si vous le sortez de la file d'attente. Vous ne pouvez pas, par exemple, obtenir la valeur du quinzième  élément de la file d'attente : il vous faut d'abord accéder aux 14 autres articles. Une fois qu'un élément est consulté, il sort de la file d'attente. Il a disparu et il n'y a aucun moyen de récupérer les données à moins de les enregistrer dans une variable à long terme.+Dans le monde des ordinateurs, les files d'attente sont très répandues. En tant qu'utilisateur, la plupart du temps vous n'avez pas à vous en préoccuper. Elles sont invisibles pour l'utilisateur. Mais si jamais vous avez à faire face à des événements en temps réel, vous allez finir par avoir à traiter avec elles. Il s'agit simplement de données d'un type ou d'un autre, qui attendent dans la file leur tour d'être traitées. Une fois qu'elles sont dans la file, elles attendent jusqu'à être traitées puis disparaissent. Vous ne pouvez pas connaître la valeur de l'élément de donnée suivant, sauf si vous le sortez de la file d'attente. Vous ne pouvez pas, par exemple, obtenir la valeur du quinzième élément de la file d'attente : il vous faut d'abord accéder aux 14 autres éléments. Une fois qu'un élément est consulté, il sort de la file d'attente. Il a disparu et il n'y a aucun moyen de récupérer les données à moins de les enregistrer dans une variable à long terme.
  
 **There are multiple types of queues. The most common ones are FIFO (First In, First Out), LIFO (Last In, First Out), Priority, and Ring. We'll talk about ring queues another time. **There are multiple types of queues. The most common ones are FIFO (First In, First Out), LIFO (Last In, First Out), Priority, and Ring. We'll talk about ring queues another time.
Ligne 20: Ligne 20:
 Il existe plusieurs types de files d'attente. Les plus courantes sont FIFO (« First In, First Out » ou premier entré, premier sorti), LIFO (« Last In, First Out » ou dernier entré, premier sorti), priorité et anneau. Nous parlerons des files d'attente anneau une autre fois. Il existe plusieurs types de files d'attente. Les plus courantes sont FIFO (« First In, First Out » ou premier entré, premier sorti), LIFO (« Last In, First Out » ou dernier entré, premier sorti), priorité et anneau. Nous parlerons des files d'attente anneau une autre fois.
  
-Les files d'attente FIFO sont celles que nous voyons dans la vie quotidienne. Tous les exemples que j'ai énumérés ci-dessus sont des files d'attente FIFO. La première personne dans la ligne est traitée d'abord, s'en va, puis tout le monde se déplace d'une place dans la ligne. Dans un tampon FIFO, il n'y a pas de limite (sauf celle de la raison) au nombre d'éléments qu'il peut contenir. Ils s'empilent simplement dans l'ordre. Lorsqu'un élément est manipulé, il est sorti de la file, et tous les autres se rapprochent d'une position du début de la file d'attente.+Les files d'attente FIFO sont celles que nous voyons dans la vie quotidienne. Tous les exemples que j'ai énumérés ci-dessus sont des files d'attente FIFO. La première personne dans la ligne est traitée d'abord, s'en va, puis tout le monde se déplace d'une place dans la ligne. Dans un tampon FIFO, il n'y a pas de limite (sauf celle de la raison) au nombre d'éléments qu'il peut contenir. Ils s'empilent simplement dans l'ordre. Lorsqu'un élément est traité, il est sorti de la file, et tous les autres se rapprochent d'une position du début de la file d'attente.
  
-Les files d'attente LIFO sont moins fréquentes dans la vie, mais il existe encore des exemples réels. Celui qui vient à l'esprit le plus rapidement est l'exemple d'une pile d'assiettes dans votre placard de cuisine. Lorsque les assiettes sont lavées et séchées, elles s'empilent dans le placard. La dernière arrivée sur la pile est la première qui sera réutilisée. Tout le reste attend, peut-être pendant des jours, pour être utilisé. C'est une bonne chose que la file d'attente pour un billet de cinéma soit FIFO, n'est ce pas ? Comme la file d'attente FIFO, en restant dans des tailles raisonnables, il n'y a pas de limite à la taille d'une file d'attente LIFO. Le premier élément entré dans la pile doit attendre que tous les éléments arrivés après lui soient retirés de la mémoire tampon (assiettes retirées de la pile) jusqu'à ce qu'il soit le seul restant.+Les files d'attente LIFO sont moins fréquentes dans la vie, mais il existe encore des exemples réels. Celui qui vient tout de suite à l'esprit est l'exemple d'une pile d'assiettes dans votre placard de cuisine. Lorsque les assiettes sont lavées et séchées, elles s'empilent dans le placard. La dernière arrivée sur la pile est la première qui sera réutilisée. Tout le reste attend, peut-être pendant des jours, pour être utilisé. C'est une bonne chose que la file d'attente pour un billet de cinéma soit FIFO, n'est-ce pas ? Comme pour la file d'attente FIFO, en restant dans des tailles raisonnables, il n'y a pas de limite à la taille d'une file d'attente LIFO. Le premier élément entré dans la pile doit attendre que tous les éléments arrivés après lui soient retirés de la mémoire tampon (assiettes retirées de la pile) jusqu'à ce qu'il soit le seul restant.
  
 **Priority queues are a bit harder for many people to imagine right off the bat. Think of a company that has one printer. Everyone uses that one printer. The print jobs are handled by department priority. Payroll has a higher priority (and thankfully so) than say, you, a programmer. You have a higher priority (and thankfully so) than the receptionist. So in short, the data that has a higher priority gets handled, and gets out of the queue, before data that has a lower priority. **Priority queues are a bit harder for many people to imagine right off the bat. Think of a company that has one printer. Everyone uses that one printer. The print jobs are handled by department priority. Payroll has a higher priority (and thankfully so) than say, you, a programmer. You have a higher priority (and thankfully so) than the receptionist. So in short, the data that has a higher priority gets handled, and gets out of the queue, before data that has a lower priority.
Ligne 32: Ligne 32:
     [1,2,3,4,5,6,7,8,9,10]**     [1,2,3,4,5,6,7,8,9,10]**
  
-Les files d'attente prioritaires sont un peu plus difficiles à comprendre du premier coup pour beaucoup de gens. Pensez à une entreprise qui possède une seule imprimante. Tout le monde utilise cette imprimante unique. Les travaux d'impression sont traitées par ordre de priorité des départements. La paie a une priorité plus élevée (et heureusement) que par exemple vous, un programmeur. Vous avez une priorité plus élevée (et heureusement) que la réceptionniste. Donc en bref, les données qui ont une priorité plus élevée sont traitées et sortent de la file d'attente avant les données qui ont une priorité inférieure.+Les files d'attente prioritaires sont un peu plus difficiles à comprendre du premier coup pour beaucoup de gens. Pensez à une entreprise qui possède une seule imprimante. Tout le monde utilise cette imprimante unique. Les travaux d'impression sont traités par ordre de priorité des départements. La paie a une priorité plus élevée (et heureusement) quepar exemplevous, un programmeur. Vous avez une priorité plus élevée (et heureusement) que la réceptionniste. En bref, donc, les données qui ont une priorité plus élevée sont traitées et sortent de la file d'attente avant les données qui ont une priorité inférieure.
  
 FIFO FIFO
Ligne 50: Ligne 50:
 I'm sure you get the idea. Python provides a simple library, surprisingly enough, called Queue, that works well for small-to-medium sized queues, up to about 500 items. Here's a simple example to show it.** I'm sure you get the idea. Python provides a simple library, surprisingly enough, called Queue, that works well for small-to-medium sized queues, up to about 500 items. Here's a simple example to show it.**
  
-Il y a 10 articles dans la liste. En tant que liste, vous y accédez par l'index. Cependant, dans une file d'attente, vous ne pouvez pas accéder aux éléments par leur index. Vous devez traiter avec le prochain dans la file et la liste n'est pas figée. Elle est TRÈS dynamique. Lorsque nous demandons à accéder à l'élément suivant, il est retiré de la file d'attente. Donc, en utilisant l'exemple ci-dessus, vous demandez un élément de la file d'attente. Elle retourne le premier élément (1) et la file d'attente ressemble alors cela.+Il y a 10 articles dans la liste. En tant que liste, vous y accédez par l'index. Cependant, dans une file d'attente, vous ne pouvez pas accéder aux éléments par leur index. Vous devez traiter avec le prochain dans la file et la liste n'est pas figée. Elle est TRÈS dynamique. Lorsque nous demandons à accéder à l'élément suivant, il est retiré de la file d'attente. Donc, en utilisant l'exemple ci-dessus, vous demandez un élément de la file d'attente. Elle retourne le premier élément (1) et la file d'attente ressemble alors à ceci.
  
      [2,3,4,5,6,7,8,9,10]      [2,3,4,5,6,7,8,9,10]
  
-Demandez-en deux de plus et vous obtenez 2, puis 3, et la file d'attente ressemble à cela.+Demandez-en deux de plus et vous obtenez 2, puis 3, et la file d'attente ressemble à ceci.
  
      [4,5,6,7,8,9,10]      [4,5,6,7,8,9,10]
  
-Je suis sûr que vous voyez l'idée. Python fournit une simple bibliothèque, assez étonnamment appelée « Queue » [Ndt : qui signifie file d'attente], qui fonctionne bien pour des files d'attente de petite et moyenne taille, jusqu'à environ 500 éléments. Voici un exemple simple de démonstration.+Je suis sûr que vous voyez l'idée. Python fournit une simple bibliothèque, assez étonnamment appelée « Queue » [Ndt : qui signifie file d'attente], qui fonctionne bien pour des files d'attente de petite et moyenne taille, jusqu'à environ 500 éléments. Voici un exemple simple de démonstration :
  
 **import Queue **import Queue
Ligne 96: Ligne 96:
     print fifo.get()**     print fifo.get()**
  
-Une fois le nombre maximum d'éléments atteint, la file d'attente bloque toute les entrées supplémentaires. Cela a cependant pour effet secondaire que le programme semble alors « planté ». La meilleure façon de contourner ce problème est d'utiliser la vérification Queue.full() qui indique si la file est pleine.+Une fois le nombre maximum d'éléments atteint, la file d'attente bloque toutes les entrées supplémentaires. Cela a cependant pour effet secondaire que le programme semble alors « planté ». La meilleure façon de contourner ce problème est d'utiliser la vérification Queue.full() qui indique si la file est pleine.
  
   import Queue   import Queue
Ligne 121: Ligne 121:
     [1,2,3,4,5,6,7]**     [1,2,3,4,5,6,7]**
  
-Dans ce cas, la file d'attente est paramétrée à un maximum de 12 éléments. Lorsque nous ajoutons des éléments dans la file d'attente, nous commençons avec 0 et arrivons à 11. Mais lorsque nous atteignons le nombre 12, le tampon est déjà plein. Puisque nous vérifions si la mémoire tampon est pleine avant d'essayer d'ajouter un élément, le dernier élément est tout simplement rejeté.+Ici, la file d'attente est paramétrée à un maximum de 12 éléments. Lorsque nous ajoutons des éléments dans la file d'attente, nous commençons avec 0 et arrivons à 11. Mais lorsque nous atteignons le nombre 12, le tampon est déjà plein. Puisque nous vérifions si la mémoire tampon est pleine avant d'essayer d'ajouter un élément, le dernier élément est tout simplement rejeté.
  
-Il existe d'autres options, mais elles peuvent causer d'autres effets secondaires, et nous aborderons la question dans un prochain article. Ainsi la plupart du temps, la voie à suivre est soit d'utiliser une file d'attente sans aucune limite, ou bien de s'assurer que l'on prévoit plus d'espace dans la file d'attente que ce dont on aura besoin.+Il existe d'autres options, mais elles peuvent causer d'autres effets secondaires, et nous aborderons la question dans un prochain article. Ainsila plupart du temps, la voie à suivre est soit d'utiliser une file d'attente sans aucune limite, soit de s'assurer que l'on prévoit plus d'espace dans la file d'attente que ce dont on aura besoin.
  
 LIFO LIFO
  
-La bibliothèque « Queue » prend également en charge les files d'attente LIFO. Nous allons utiliser la liste ci-dessus comme un exemple visuel. Lors de la mise en place de notre file d'attente, elle ressemble à ceci :+La bibliothèque « Queue » prend également en charge les files d'attente LIFO. Nous allons utiliser la liste ci-dessus comme exemple visuel. Lors de la mise en place de notre file d'attente, elle ressemble à ceci :
      [1,2,3,4,5,6,7,8,9,10]      [1,2,3,4,5,6,7,8,9,10]
  
Ligne 158: Ligne 158:
 Lorsqu'on l'exécute, on obtient 4,3,2,1,0. Lorsqu'on l'exécute, on obtient 4,3,2,1,0.
  
-Comme avec la file FIFO,vous pouvez régler la taille maximum de la file d'attente et utiliser la vérification .full() pour savoir si elle est pleine.+Comme pour la file FIFO,vous pouvez régler la taille maximum de la file d'attente et utiliser la vérification .full() pour savoir si elle est pleine.
  
 **PRIORITY **PRIORITY
Ligne 179: Ligne 179:
 PRIORITÉ PRIORITÉ
  
-Même si elle n'est pas souvent utilisée, une file de priorité peut parfois être utile. C'est à peu près la même structure que pour les autres files d'attente, mais nous devons de lui passer un tuple qui contient à la fois la priorité et les données. Voici un exemple en utilisant la bibliothèque « Queue » :+Même si elle n'est pas souvent utilisée, une file de priorité peut parfois être utile. C'est à peu près la même structure que pour les autres files d'attente, mais nous devons lui passer un tuple qui contient à la fois la priorité et les données. Voici un exemple en utilisant la bibliothèque « Queue » :
  
   pq = Queue.PriorityQueue()   pq = Queue.PriorityQueue()
Ligne 216: Ligne 216:
   Basse   Basse
  
-Dans nos deux premiers exemples, nous avons simplement affiché les données qui sortent de notre file d'attente. C'est très bien pour ces exemples, mais dans le monde réel de programmation, vous aurez probablement besoin de faire quelque chose avec cette information dès qu'elle sort de la file d'attente, sinon elle sera perdue. Lorsque nous utilisons « print fifo.get', nous envoyons les données vers le terminal puis elle sont détruites. Il faut juste garder ça à l'esprit.+Dans nos deux premiers exemples, nous avons simplement affiché les données qui sortent de notre file d'attente. C'est très bien pour ces exemples, mais dans le monde réel de la programmation, vous aurez probablement besoin de faire quelque chose avec cette information dès qu'elle sort de la file d'attente, sinon elle sera perdue. Lorsque nous utilisons « print fifo.get », nous envoyons les données vers le terminal puis elle sont détruites. Il faut juste garder ça à l'esprit.
  
 **Now let's use some of what we've already learned about tkinter to create a queue demo program. This demo will have two frames. The first will contain (to the user) three buttons. One for a FIFO queue, one for a LIFO queue, and one for a PRIORITY queue. The second frame will contain an entry widget, two buttons, one for adding to the queue, and one for pulling from the queue, and three labels, one showing when the queue is empty, one showing when the queue is full, and one to display what has been pulled from the queue. We'll also be writing some code to automatically center the window within the screen. Here's the beginning of the code. **Now let's use some of what we've already learned about tkinter to create a queue demo program. This demo will have two frames. The first will contain (to the user) three buttons. One for a FIFO queue, one for a LIFO queue, and one for a PRIORITY queue. The second frame will contain an entry widget, two buttons, one for adding to the queue, and one for pulling from the queue, and three labels, one showing when the queue is empty, one showing when the queue is full, and one to display what has been pulled from the queue. We'll also be writing some code to automatically center the window within the screen. Here's the beginning of the code.
Ligne 263: Ligne 263:
 </nowiki>** </nowiki>**
  
-Ici, nous avons nos importations et le début de notre classe. Comme précédemment, nous créons la routine __init__ avec les routines DefinirVariables, ConstruireWidgetset PlacerWidgets. Nous avons aussi une routine appelée AfficherStatut qui... affichera l'état de notre file d'attente.+Ici, nous avons nos importations et le début de notre classe. Comme précédemment, nous créons la routine __init__ avec les routines DefinirVariables, ConstruireWidgets et PlacerWidgets. Nous avons aussi une routine appelée AfficherStatut qui... affichera l'état de notre file d'attente.
  
    def DefinirVariables(self):    def DefinirVariables(self):
         self.TypeDeFile = ''         self.TypeDeFile = ''
-        self.DerniereFile = '' 
         self.StatutPlein = StringVar()         self.StatutPlein = StringVar()
         self.StatutVide = StringVar()         self.StatutVide = StringVar()
Ligne 368: Ligne 367:
         self.btnGet.bind('<ButtonRelease-1>',self.GetFromQueue)**         self.btnGet.bind('<ButtonRelease-1>',self.GetFromQueue)**
  
-Ici nous commençons les définitions des widgets. Nous créons notre premier cadre, les trois boutonset leurs fonctions de rappel. Notez que nous utilisons la même routine pour gérer les fonctions de rappel. Chaque bouton envoie une valeur à la routine de rappel pour indiquer quel bouton a été cliqué. Nous pourrions tout aussi bien pu créer une routine dédiée pour chaque bouton. Cependant, puisque les trois boutons gèrent une tâche commune, j'ai pensé qu'il serait bon de les considérer comme un groupe.+Ici nous commençons la définition des widgets. Nous créons notre premier cadre, les trois boutons et leurs fonctions de rappel. Notez que nous utilisons la même routine pour gérer les fonctions de rappel. Chaque bouton envoie une valeur à la routine de rappel pour indiquer quel bouton a été cliqué. Nous pourrions tout aussi bien pu créer une routine dédiée pour chaque bouton. Cependant, puisque les trois boutons gèrent une tâche commune, j'ai pensé qu'il serait bon de les considérer comme un groupe.
  
         self.f2 = Frame(fenetre,          self.f2 = Frame(fenetre, 
Ligne 414: Ligne 413:
         return frame**         return frame**
  
-Ensuite nous mettons en place le second cadre, le widget de saisie et les deux boutons. La seule chose ici qui sort de l'ordinaire est le rappel pour le widget de saisie. Ici nous associons la routine self.AjouterALaFile à la touche « Return » (Entrée). De cette façon, l'utilisateur n'a pas à utiliser la souris pour ajouter les données. Il peut simplement entrer les données dans la zone de saisie et appuyez sur Entrée.+Ensuite nous mettons en place le second cadre, le widget de saisie et les deux boutons. La seule chose ici qui sort de l'ordinaire est le rappel pour le widget de saisie. Ici nous associons la routine self.AjouterALaFile à la touche « Return » (Entrée). De cette façon, l'utilisateur n'a pas à utiliser la souris pour ajouter les données. Il peut simplement entrer les données dans la zone de saisie et appuyer sur Entrée.
  
         self.lblEmpty = Label(self.f2,         self.lblEmpty = Label(self.f2,
Ligne 453: Ligne 452:
 </nowiki>** </nowiki>**
  
-Voici les trois dernières définitions de widgets. Tous trois sont des étiquettes. Nous réglons l'attribut textvariable des variables que nous avons défini plus tôt. Si vous vous souvenez, lorsque cette variable change, le texte de l'étiquette changera aussi. Nous faisons aussi quelque chose d'un peu différent sur ​​l'étiquette lblData. Nous allons utiliser une police différente pour faire ressortir l'affichage des données extraites de la file d'attente. Rappelez-vous que nous devons retourner l'objet fenetre de sorte qu'il puisse être utilisé dans la routine PlacerWidgets.+Voici les trois dernières définitions de widgets. Toutes les trois sont des étiquettes. Nous réglons l'attribut textvariable des variables que nous avons définies plus tôt. Si vous vous souvenez, lorsque cette variable change, le texte de l'étiquette changera aussi. Nous faisons aussi quelque chose d'un peu différent sur ​​l'étiquette lblData. Nous allons utiliser une police différente pour faire ressortir l'affichage des données extraites de la file d'attente. Rappelez-vous que nous devons retourner l'objet fenêtre de sorte qu'il puisse être utilisé dans la routine PlacerWidgets.
  
     def PlacerWidgets(self, principale):     def PlacerWidgets(self, principale):
Ligne 555: Ligne 554:
             self.FullStatus.set('')**             self.FullStatus.set('')**
  
-Maintenant, notre routine principale de rappel pour les boutons, btnMain. Rappelez-vous que nous lui envoyons (via le paramètre p1) quel bouton a été cliqué. Nous utilisons la variable self.TypeDeFile en référence au type de file d'attente que nous sommes en train de gérer, puis nous assignons à self.obj la file d'attente appropriéeet enfin changeons le titre de notre fenêtre racine pour afficher le type de file d'attente que nous utilisons. Après cela, nous affichons le type de file dans le terminal (vous n'êtes pas obligé de faire cela), puis appelons la routine AfficherStatut. Maintenant nous allons écrire la routine AfficherStatut.+Maintenant, notre routine principale de rappel pour les boutons, btnMain. Rappelez-vous que nous lui envoyons (via le paramètre p1) quel bouton a été cliqué. Nous utilisons la variable self.TypeDeFile en référence au type de file d'attente que nous sommes en train de gérer, puis nous assignons à self.obj la file d'attente appropriée etenfinchangeons le titre de notre fenêtre racine pour afficher le type de file d'attente que nous utilisons. Après cela, nous affichons le type de file dans le terminal (vous n'êtes pas obligé de faire cela), puis appelons la routine AfficherStatut. Maintenant nous allons écrire la routine AfficherStatut.
  
     def AfficherStatut(self):     def AfficherStatut(self):
Ligne 594: Ligne 593:
             commapos = temp.find(',')             commapos = temp.find(',')
             if commapos == -1:             if commapos == -1:
-                print "ERROR"+                print "ERREUR"
                 tkMessageBox.showerror('Demo File',                 tkMessageBox.showerror('Demo File',
                     'Un element Priority doit etre au format\r(priorite,valeur)')                     'Un element Priority doit etre au format\r(priorite,valeur)')
Ligne 638: Ligne 637:
         window.deiconify()**         window.deiconify()**
  
-La routine RecupererDansFile est encore plus facile. Nous vérifions si la file est vide afin de ne pas nous heurter à un problème de blocageet si ce n'est pas le cas nous retirons les données de la file d'attente, l'affichons, et mettons à jour le statut.+La routine RecupererDansFile est encore plus facile. Nous vérifions si la file est vide afin de ne pas nous heurter à un problème de blocage etsi ce n'est pas le casnous retirons les données de la file d'attente, l'affichons, et mettons à jour le statut.
  
 if __name__ == '__main__': if __name__ == '__main__':
Ligne 661: Ligne 660:
     root.mainloop()**     root.mainloop()**
  
-Nous arrivons à la fin de notre application. Voici la routine de centrage de fenêtre. Nous récupérons d'abord la largeur et la hauteur de l'écran. Nous récupérons ensuite la largeur et la hauteur de la fenêtre racine à l'aide des routines winfo_reqwidth() et winfo_reqheight() intégrées à tkinter. Ces routines, lorsqu'elles sont appelées au bon moment, retourneront la largeur et la hauteur de la fenêtre racine en tenant compte du placement des widgets. Si vous l'appelez trop tôt, vous obtiendrez des valeurs mais pas celles dont vous avez vraiment besoin. Nous soustrayons ensuite la largeur de la fenêtre de la largeur de l'écran, et divisons cela par 2, puis nous faisons la même chose pour la hauteur. Nous utilisons alors ces informations dans l'appel de la fonction geometry. La plupart du temps, cela fonctionne à merveille. Toutefois, il pourrait y avoir des moments où vous aurez besoin de définir la largeur et la hauteur à la main.+Nous arrivons à la fin de notre application. Voici la routine de centrage de fenêtre. Nous récupérons d'abord la largeur et la hauteur de l'écran. Nous récupérons ensuite la largeur et la hauteur de la fenêtre racine à l'aide des routines winfo_reqwidth() et winfo_reqheight() intégrées à tkinter. Ces routines, lorsqu'elles sont appelées au bon moment, retourneront la largeur et la hauteur de la fenêtre racine en tenant compte du placement des widgets. Si vous l'appelez trop tôt, vous obtiendrez des valeursmais pas celles dont vous avez vraiment besoin. Nous soustrayons ensuite la largeur de la fenêtre de la largeur de l'écran, et divisons cela par 2, puis nous faisons la même chose pour la hauteur. Nous utilisons alors ces informations dans l'appel de la fonction geometry. La plupart du temps, cela fonctionne à merveille. Toutefois, il pourrait y avoir des moments où vous aurez besoin de définir la largeur et la hauteur à la main.
  
     root = Tk()     root = Tk()
Ligne 675: Ligne 674:
 Well, that's it for this time. Have fun with your queues. The QueueTest code can be found at http://pastebin.com/5BBUiDce.** Well, that's it for this time. Have fun with your queues. The QueueTest code can be found at http://pastebin.com/5BBUiDce.**
  
-Enfin, nous instancions la fenêtre racine, définissons le titre de baseet instancions la class TestFiles. Nous appelons ensuite root.after, qui attend un nombre x de millisecondes (dans ce cas 3) après que la fenêtre racine soit instanciée, puis appelle la routine Centrer. De cette façon, la fenêtre racine a été complètement paramétrée et est prête à s'afficher, donc nous pouvons obtenir sa largeur et la hauteur. Vous pourriez avoir à ajuster légèrement le temps de retard. Certaines machines sont beaucoup plus rapides que d'autres. 3 fonctionne très bien sur ma machine, votre réglage peut varier. Enfin nous appelons la boucle principale de la fenêtre racine pour exécuter l'application.+Enfin, nous instancions la fenêtre racine, définissons le titre de base et instancions la class TestFiles. Nous appelons ensuite root.after, qui attend un nombre x de millisecondes (dans ce cas 3)après que la fenêtre racine soit instanciée, puis appelle la routine Centrer. De cette façon, la fenêtre racine a été complètement paramétrée et est prête à s'afficher, donc nous pouvons obtenir sa largeur et sa hauteur. Vous pourriez avoir à ajuster légèrement le temps de retard. Certaines machines sont beaucoup plus rapides que d'autres. 3 fonctionne très bien sur ma machine, votre réglage peut varier. Enfin nous appelons la boucle principale de la fenêtre racine pour exécuter l'application.
  
-Pendant que vous jouez avec les files d'attente, notez que si vous mettez des données dans une file d'attente (disons la file d'attente FIFO), puis passez à une autre file d'attente (disons la file d'attente LIFO), les données qui ont été placées dans la file FIFO sont toujours là et vous attendent. Vous pouvez complètement ou partiellement remplir tous les trois files d'attente, puis commencer à jouer avec.+Pendant que vous jouez avec les files d'attente, notez que si vous mettez des données dans une file d'attente (disons la file d'attente FIFO), puis passez à une autre file d'attente (disons la file d'attente LIFO), les données qui ont été placées dans la file FIFO sont toujours là et vous attendent. Vous pouvez complètement ou partiellement remplir les trois files d'attente, puis commencer à jouer avec.
  
-Eh bien, c'est tout pour cette fois. Amusez-vous avec vos files d'attente. Le code de TestFiles peut être trouvé ici : http://pastebin.com/5yjcf8R7+Eh bien, c'est tout pour cette fois-ci. Amusez-vous avec vos files d'attente. Le code de TestFiles peut être trouvé ici : http://pastebin.com/MKLTmSES
  
issue53/tutopython.1321391137.txt.gz · Dernière modification : 2011/11/15 22:05 de fredphil91