Outils pour utilisateurs

Outils du site


issue175:python

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
issue175:python [2021/11/30 18:49] d52frissue175:python [2021/12/03 14:47] (Version actuelle) andre_domenech
Ligne 20: Ligne 20:
 Just in case you don’t have PAGE, you can get it at https://sourceforge.net/projects/page/. The installation details are in the documentation or in various past Full Circle articles of mine. You should use Python 3.6 or higher, since I use f-strings for some of the print statements.** Just in case you don’t have PAGE, you can get it at https://sourceforge.net/projects/page/. The installation details are in the documentation or in various past Full Circle articles of mine. You should use Python 3.6 or higher, since I use f-strings for some of the print statements.**
  
-Nous allons utiliser deux bibliothèques Python externes. Vous les avez peut-être déjà. Il s'agit de requests et PIL (pillow). Si vous ne les avez pas, vous pouvez utiliser pip pour les installer. Elles doivent être sur votre système avant que vous n'essayiez d'exécuter le projet.+Nous utiliserons deux bibliothèques Python externes. Vous les avez peut-être déjà. Il s'agit de requests et PIL (pillow). Si vous ne les avez pas, vous pouvez utiliser pip pour les installer. Elles doivent être sur votre système avant que vous n'essayiez d'exécuter le projet.
  
-Voici à quoi ressemble ma version de son projet pendant une session d'exécution.+Voici à quoi ressemble ma version de son projet pendant une session qui tourne.
  
-J'ai décidé de faire un peu plus d'espace entre les rangées de widgets accessibles à l'utilisateur, car ma main de souris a tendance à trembler un peu. Nous allons commencer à créer l'interface graphique en PAGE.+J'ai décidé de faire un peu plus d'espace entre les rangées de widgets accessibles à l'utilisateur, car la main que j'utilise pour la souris a tendance à trembler un peu. Nous allons commencer à créer l'interface graphique en PAGE.
  
-Au cas où vous n'auriez pas PAGE, vous pouvez l'obtenir sur https://sourceforge.net/projects/page/. Les détails de l'installation se trouvent dans la documentation ou dans plusieurs de mes anciens articles de Full Circle. Vous devriez utiliser Python 3.6 ou une version plus récente, car j'utilise des chaînes f pour certaines des instructions d'impression.+Au cas où vous n'auriez pas PAGE, vous pouvez l'obtenir sur https://sourceforge.net/projects/page/. Les détails de l'installation se trouvent dans la documentation ou dans plusieurs de mes anciens articles de Full Circle. Vous devriez utiliser Python 3.6 ou une version plus récente, car j'utilise des f-strings pour certaines des instructions d'impression.
  
  
 **Let’s look at some of the requirements that we need to keep in mind during the design process. The images that come in from the Internet will be 704x480 pixels. The shortest time between the images is 45 seconds. This information came from the author's blog page as well as his code (his blog page states the image size is 704x408, but the actual image and his code is 704x480). The only code of his that I used are a few of his constants. The rest of the code for this project is code that I have used in previous projects. His project allows the end user to select the time between requests to be between 45 seconds and 300 seconds. He also allows the ability to change the aspect ratio from 704x480 to a 16x9 format which means that the image will be resized to 704x396 before it is displayed and/or saved. There is a Checkbutton that allows for this resize to be performed. The author has a Save button that allows the image to be saved to the hard drive, as well as a Reload button. This is helpful if you change between the native image size to the 16x9 format (or if you are impatient and don’t want to wait for the next refresh to occur). He also provides a Checkbutton to change the delay time between requests, and a text entry widget (and a button) to set the new time. I decided to use a Tk::Spinbox to make the time selection easier and doesn’t require the Set button. I do, however, include the set button, but all it does is bring up a warning Message box. The reason that I decided to use the Spinbox is that if you use the Up/Down arrows on the Spinbox, you don’t have to check if the value is numeric, keeping the code simpler.** **Let’s look at some of the requirements that we need to keep in mind during the design process. The images that come in from the Internet will be 704x480 pixels. The shortest time between the images is 45 seconds. This information came from the author's blog page as well as his code (his blog page states the image size is 704x408, but the actual image and his code is 704x480). The only code of his that I used are a few of his constants. The rest of the code for this project is code that I have used in previous projects. His project allows the end user to select the time between requests to be between 45 seconds and 300 seconds. He also allows the ability to change the aspect ratio from 704x480 to a 16x9 format which means that the image will be resized to 704x396 before it is displayed and/or saved. There is a Checkbutton that allows for this resize to be performed. The author has a Save button that allows the image to be saved to the hard drive, as well as a Reload button. This is helpful if you change between the native image size to the 16x9 format (or if you are impatient and don’t want to wait for the next refresh to occur). He also provides a Checkbutton to change the delay time between requests, and a text entry widget (and a button) to set the new time. I decided to use a Tk::Spinbox to make the time selection easier and doesn’t require the Set button. I do, however, include the set button, but all it does is bring up a warning Message box. The reason that I decided to use the Spinbox is that if you use the Up/Down arrows on the Spinbox, you don’t have to check if the value is numeric, keeping the code simpler.**
  
-Examinons quelques-unes des exigences que nous devons garder à l'esprit pendant le processus de conception. Les images provenant d'Internet auront une taille de 704x480 pixels. Le temps le plus court entre les images est de 45 secondes. Ces informations proviennent de la page du blog de l'auteur ainsi que de son code (sa page de blog indique que la taille de l'image est de 704x408, mais l'image réelle et son code sont de 704x480). Le seul code que j'ai utilisé est celui de certaines de ses constantes. Le reste du code pour ce projet est du code que j'ai utilisé dans des projets précédents. Son projet permet à l'utilisateur final de sélectionner un délai entre les requêtes entre 45 secondes et 300 secondes. Il permet également de modifier le rapport d'aspect de 704x480 à un format 16:9, ce qui signifie que l'image sera redimensionnée à 704x396 avant d'être affichée et/ou sauvegardée. Il y a un bouton à cocher qui permet d'effectuer ce redimensionnement. L'auteur dispose d'un bouton Enregistrer qui permet de sauvegarder l'image sur le disque dur, ainsi que d'un bouton Recharger. Ce dernier est utile si vous passez de la taille native de l'image au format 16:9 (ou si vous êtes impatient et ne voulez pas attendre le prochain rafraîchissement). Il fournit également un bouton de contrôle pour modifier le délai entre les requêtes, et un widget de saisie de texte (et un bouton) pour définir le nouveau délai. J'ai décidé d'utiliser une Tk::Spinbox pour faciliter la sélection du temps et le bouton Set n'est pas nécessaire. J'inclus cependant le bouton Set, mais il ne fait qu'afficher une boîte de message d'avertissement. La raison pour laquelle j'ai décidé d'utiliser la Spinbox est que si vous utilisez les flèches Haut/Bas de la Spinbox, vous n'avez pas besoin de vérifier si la valeur est numérique, ce qui simplifie le code.+Examinons quelques-unes des exigences que nous devons garder à l'esprit pendant le processus de conception. Les images provenant d'Internet auront une taille de 704 x 480 pixels. Le temps le plus court entre les images est de 45 secondes. Ces informations proviennent de la page du blog de l'auteur ainsi que de son code (sa page de blog indique que la taille de l'image est de 704 x 408, mais l'image réelle et son code sont de 704 x 480). De son code, je n'ai utilisé que certaines de ses constantes. Le reste du code pour ce projet est du code que j'ai utilisé dans des projets précédents. Son projet permet à l'utilisateur final de sélectionner un délai entre les requêtes de 45 secondes et 300 secondes. Il permet également de modifier le rapport d'aspect de 704x480 à un format 16:9, ce qui signifie que l'image sera redimensionnée à 704 x 396 avant d'être affichée et/ou sauvegardée. Il y a un bouton de contrôle qui permet d'effectuer ce redimensionnement. L'auteur dispose d'un bouton Enregistrer qui permet de sauvegarder l'image sur le disque dur, ainsi que d'un bouton Recharger. Ce dernier est utile si vous passez de la taille native de l'image au format 16:9 (ou si vous êtes impatient et ne voulez pas attendre le prochain rafraîchissement). Il fournit également un bouton de contrôle pour modifier le délai entre les requêtes, et un widget de saisie de texte (et un bouton) pour définir le nouveau délai. J'ai décidé d'utiliser une Tk::Spinbox pour faciliter la sélection du temps et le bouton Set n'est pas nécessaire. J'inclus cependant le bouton Set, mais il ne fait qu'afficher un message d'avertissement. La raison pour laquelle j'ai décidé d'utiliser la Spinbox est que si vous utilisez les flèches Haut/Bas de la Spinbox, vous n'avez pas besoin de vérifier si la valeur est numérique, ce qui simplifie le code.
  
  
Ligne 42: Ligne 42:
 Lancez donc PAGE, et redimensionnez la fenêtre par défaut du concepteur Toplevel à environ 777 pixels de large et 657 de haut. Ne vous préoccupez pas trop des dimensions réelles du formulaire principal, il suffit qu'elles soient proches. Déplacez maintenant le formulaire au milieu de votre écran. Définissez « NasaStills-tk » pour l'attribut title dans l'éditeur d'attributs. Pendant que vous êtes dans l'éditeur d'attributs, définissez la couleur d'arrière-plan sur « skyblue4 ». Il s'agit d'une belle couleur gris bleuté foncé. Lancez donc PAGE, et redimensionnez la fenêtre par défaut du concepteur Toplevel à environ 777 pixels de large et 657 de haut. Ne vous préoccupez pas trop des dimensions réelles du formulaire principal, il suffit qu'elles soient proches. Déplacez maintenant le formulaire au milieu de votre écran. Définissez « NasaStills-tk » pour l'attribut title dans l'éditeur d'attributs. Pendant que vous êtes dans l'éditeur d'attributs, définissez la couleur d'arrière-plan sur « skyblue4 ». Il s'agit d'une belle couleur gris bleuté foncé.
  
-Ensuite, nous allons placer un widget de cadre dans le formulaire Toplevel. Il contiendra le widget Label que nous utiliserons pour afficher l'image fixe du site de la Nasa. Placez-le près du coin supérieur gauche du formulaire principal. Ne vous préoccupez pas trop du placement à ce stade. En utilisant à nouveau l'éditeur d'attributs, assurez-vous que le cadre est sélectionné et définissez la largeur à 714 et la hauteur à 492. Ensuite, ajoutez un widget Label et définissez les positions X et Y dans l'éditeur d'attributs à 2 et 2. Cela permettra de créer une petite bordure autour du widget Étiquette lorsqu'il sera réglé à sa taille maximale. Définissez la largeur de l'étiquette à 704, la hauteur à 488 et la couleur de fond à « skyblue3 ». Cela nous donne une belle couleur pour la zone d'affichage visuelle intérieure. Définissez l'alias du widget Label comme « labelImage », et supprimez le texte dans l'attribut text.+Ensuite, nous allons placer un widget de cadre dans le formulaire Toplevel. Il contiendra le widget Label que nous utiliserons pour afficher l'image fixe du site de la NASA. Placez-le près du coin supérieur gauche du formulaire principal. Ne vous préoccupez pas trop du placement à ce stade. En utilisant à nouveau l'éditeur d'attributs, assurez-vous que le cadre est sélectionné et définissez la largeur à 714 et la hauteur à 492. Ensuite, ajoutez un widget Label et définissez les positions X et Y dans l'éditeur d'attributs à 2 et 2. Cela créera une petite bordure autour du widget Étiquette lorsqu'il sera réglé à sa taille maximale. Définissez la largeur de l'étiquette à 704, la hauteur à 488 et la couleur de fond à « skyblue3 ». Cela nous donne une belle couleur pour la zone d'affichage visuelle intérieure. Définissez l'alias du widget Label comme « labelImage », et supprimez le texte dans l'attribut text.
  
 Nous allons maintenant terminer le placement de la combinaison Cadre et Étiquette. PAGE dispose d'une fonction qui vous permet de sélectionner plusieurs widgets et de les manipuler en tant que groupe, par exemple en les centrant horizontalement ou verticalement, en les espaçant de manière égale au sein de leur parent, etc. À ce stade, nous voulons simplement centrer horizontalement le cadre dans le formulaire principal. Dans l'arbre des widgets, utilisez le bouton central de la souris pour cliquer sur l'entrée Frame: Frame1. Nous allons maintenant terminer le placement de la combinaison Cadre et Étiquette. PAGE dispose d'une fonction qui vous permet de sélectionner plusieurs widgets et de les manipuler en tant que groupe, par exemple en les centrant horizontalement ou verticalement, en les espaçant de manière égale au sein de leur parent, etc. À ce stade, nous voulons simplement centrer horizontalement le cadre dans le formulaire principal. Dans l'arbre des widgets, utilisez le bouton central de la souris pour cliquer sur l'entrée Frame: Frame1.
Ligne 201: Ligne 201:
     che48 = tk.IntVar()     che48 = tk.IntVar()
  
-La fonction suivante dans le fichier doit être la fonction init. PAGE crée cette fonction pour nouset encore une fois, nous devons faire un ajout d'une ligne dans cette fonction. Je vais la mettre en gras.+La fonction suivante dans le fichier doit être la fonction init. PAGE crée cette fonction pour nous etencore une fois, nous devons faire un ajout d'une ligne dans cette fonction. Je vais la mettre en gras.
  
  
Ligne 318: Ligne 318:
     destroy_window()     destroy_window()
  
-Le on_btnExit est le callback pour le bouton Exit. Il appelle simplement la fonction destroy_window créée par la PAGE pour fermer le programme correctement.+Le on_btnExit est le callback pour le bouton Exit. Il appelle simplement la fonction destroy_window créée par  PAGE pour fermer le programme correctement.
  
-La fonction on_btnReload est la fonction de rappel qui va recharger l'image. Elle appelle la fonction get_image_from_web. Si vous cliquez sur le bouton Aspect, cela forcera un rafraîchissement de l'image dans le rapport d'aspect actuellement défini, soit 16:9 ou 708x480.+La fonction on_btnReload est la fonction de rappel qui va recharger l'image. Elle appelle la fonction get_image_from_web. Si vous cliquez sur le bouton Aspect, cela forcera un rafraîchissement de l'image dans le rapport d'aspect actuellement défini, soit 16:9, soit 708x480.
  
  
Ligne 397: Ligne 397:
 The on_tick function (page after next, top right) is where the rest of the “magic” happens, in my mind at least. Here we use the root.after function of Tkinter to create a timer event. The first thing we do is to get the current value of the spinbox (between 45 and 300) and store it in a temporary variable rt (standing for refresh time). It then calls the get_image_from_web function to get the image and refresh the Label. Finally the callback is enabled with the time in milliseconds (rt * 1000) and reset the callback for the next call.** The on_tick function (page after next, top right) is where the rest of the “magic” happens, in my mind at least. Here we use the root.after function of Tkinter to create a timer event. The first thing we do is to get the current value of the spinbox (between 45 and 300) and store it in a temporary variable rt (standing for refresh time). It then calls the get_image_from_web function to get the image and refresh the Label. Finally the callback is enabled with the time in milliseconds (rt * 1000) and reset the callback for the next call.**
  
-La fonction get_image_from_web (page suivante, en haut à droite) est l'endroit où la première partie de la « magie » opère. Nous utilisons la méthode requests.get de la bibliothèque requests pour récupérer une image sur un site Web. L'image est reçue et enregistrée au format .png. Ensuite, nous vérifions la largeur et la hauteur de l'image. Si la taille est correcte (704x480) et que le bouton de vérification du rapport hauteur/largeur n'est pas coché, l'image est simplement enregistrée comme une image locale. Si le bouton de vérification du rapport hauteur/largeur EST coché, la bibliothèque PIL redimensionne l'image au format 16:9 avant de l'enregistrer. Enfin, nous définissons l'attribut image de l'étiquette avec le nom de l'image que nous venons de télécharger. Nous l'enregistrons également dans un fichier local pratique, au cas où l'utilisateur voudrait l'enregistrer.+La fonction get_image_from_web (page suivante, en haut à droite) est l'endroit où la première partie de la « magie » opère. Nous utilisons la méthode requests.get de la bibliothèque requests pour récupérer une image sur un site Web. L'image est reçue et enregistrée au format .png. Ensuite, nous vérifions la largeur et la hauteur de l'image. Si la taille est correcte (704 x 480) et que le bouton de vérification du rapport hauteur/largeur n'est pas coché, l'image est simplement enregistrée comme une image locale. Si le bouton de vérification du rapport hauteur/largeur EST coché, la bibliothèque PIL redimensionne l'image au format 16:9 avant de l'enregistrer. Enfin, nous définissons l'attribut image de l'étiquette avec le nom de l'image que nous venons de télécharger. Nous l'enregistrons également dans un fichier local pratique, au cas où l'utilisateur voudrait l'enregistrer.
  
 La fonction on_tick (2 pages plus loin, en haut à droite) est l'endroit où le reste de la « magie » fait effet, du moins dans mon esprit. Ici, nous utilisons la fonction root.after de Tkinter pour créer un événement de timer. La première chose que nous faisons est de récupérer la valeur actuelle de la spinbox (entre 45 et 300) et de la stocker dans une variable temporaire rt (pour refresh time). On appelle ensuite la fonction get_image_from_web pour obtenir l'image et rafraîchir l'étiquette. Enfin, le callback est activé avec le temps en millisecondes (rt * 1000) et réinitialise la callback pour le prochain appel. La fonction on_tick (2 pages plus loin, en haut à droite) est l'endroit où le reste de la « magie » fait effet, du moins dans mon esprit. Ici, nous utilisons la fonction root.after de Tkinter pour créer un événement de timer. La première chose que nous faisons est de récupérer la valeur actuelle de la spinbox (entre 45 et 300) et de la stocker dans une variable temporaire rt (pour refresh time). On appelle ensuite la fonction get_image_from_web pour obtenir l'image et rafraîchir l'étiquette. Enfin, le callback est activé avec le temps en millisecondes (rt * 1000) et réinitialise la callback pour le prochain appel.
Ligne 416: Ligne 416:
 Finally, we have the centre_screen function, which takes the width and height of our main form (which is provided in the GUI python file that PAGE creates). It then uses the screen width and height to calculate the centre of the screen and form.** Finally, we have the centre_screen function, which takes the width and height of our main form (which is provided in the GUI python file that PAGE creates). It then uses the screen width and height to calculate the centre of the screen and form.**
  
-La fonction showinfo prend deux paramètres, le titre et le message, puis appelle la boîte de message Tkinter pour montrer la boîte de message à l'utilisateur. Nous fournissons également le parent (qui dans ce cas sera toujours root), mais qui gardera la boîte de message au dessus de l'application actuelle et définit l'icône comme étant l'icône INFO.+La fonction showinfo prend deux paramètres, le titre et le message, puis appelle la boîte de message Tkinter pour montrer la boîte de message à l'utilisateur. Nous fournissons également le parent (qui dans ce cas sera toujours root, mais qui gardera la boîte de message au dessus de l'application actuelleet définit l'icône comme étant l'icône INFO.
  
 def showinfo(titl, msg) : def showinfo(titl, msg) :
issue175/python.1638294574.txt.gz · Dernière modification : 2021/11/30 18:49 de d52fr