Outils pour utilisateurs

Outils du site


issue155: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
issue155:python [2020/04/04 11:59] auntieeissue155:python [2020/04/04 18:00] (Version actuelle) andre_domenech
Ligne 5: Ligne 5:
 Une rapide mise à jour à propos de la bibliothèque recipe-scrapers dont j'ai parlé le mois dernier. Actuellement, 47 sites différents de recettes sont supportés, comprenant les 5 dont j'ai parlé pour le projet. Je travaille sur quelques autres sites pour le projet, ce qui fait continuellement monter leur nombre. Beaucoup des extracteurs sont dédiés à des sites hors des USA dans de nombreuses langues différentes. J'expliquerai probablement le processus de la création de votre propre extracteur dans un article futur. Une rapide mise à jour à propos de la bibliothèque recipe-scrapers dont j'ai parlé le mois dernier. Actuellement, 47 sites différents de recettes sont supportés, comprenant les 5 dont j'ai parlé pour le projet. Je travaille sur quelques autres sites pour le projet, ce qui fait continuellement monter leur nombre. Beaucoup des extracteurs sont dédiés à des sites hors des USA dans de nombreuses langues différentes. J'expliquerai probablement le processus de la création de votre propre extracteur dans un article futur.
  
-Comme la plupart d'entre vous le savent, je suis un point de contact de support officieux de Page, le concepteur en affichage graphique pour Python utilisant Tkinter. En moyenne, je passe 5 heures par semaine à répondre aux questions des utilisateurs, que ce soit de tout nouveaux utilisateurs ou des utilisateurs qui utilisent Page depuis des années. J'aide aussi Don Rozenberg en testant les compilations du développement, en essayant de les casser par des moyens aussi différents que possible. Une fois que je n'arrive plus à les détruire, Don crée généralement une version publiée. C'est un travail qui demande beaucoup de temps, mais que j'adore.+Comme la plupart d'entre vous le savent, je suis un point de contact de support officieux de Page, le concepteur en affichage graphique pour Python utilisant Tkinter. En moyenne, je passe 5 heures par semaine à répondre aux questions des utilisateurs, que ce soit de tout nouveaux utilisateurs ou des utilisateurs qui utilisent Page depuis des années. J'aide aussi Don Rozenberg en testant les compilations du développement, en essayant de les casser par des moyens aussi différents que possible. Lorsque je n'arrive plus à les détruire, Don crée généralement une version publiée. C'est un travail qui demande beaucoup de temps, mais que j'adore.
  
 **Of all the questions I get about using Page, the one I get the most is how to create a program with multiple forms. The answer to this is really pretty easy, but is not as straight-forward as a user would think, hence the questions. The next question is how do I get the forms or windows to communicate with each other. My good friend Halvard from Norway asked how to have one form read information from another in “real time”. Again, while the answer is easy, it’s not something that most users would try before they ask the question. So, in this edition, I intend to present a very simple demo to help understand the process. AND there’s an added benefit in that this solution is not limited to a Page GUI program. It can be used for any Python program including CLI programs. Your imagination is the only limit. **Of all the questions I get about using Page, the one I get the most is how to create a program with multiple forms. The answer to this is really pretty easy, but is not as straight-forward as a user would think, hence the questions. The next question is how do I get the forms or windows to communicate with each other. My good friend Halvard from Norway asked how to have one form read information from another in “real time”. Again, while the answer is easy, it’s not something that most users would try before they ask the question. So, in this edition, I intend to present a very simple demo to help understand the process. AND there’s an added benefit in that this solution is not limited to a Page GUI program. It can be used for any Python program including CLI programs. Your imagination is the only limit.
Ligne 13: Ligne 13:
 The project will consist of two Page forms, one called “Parent” and the other called “Child”. The Parent program will launch the Child program and will receive data from the child.** The project will consist of two Page forms, one called “Parent” and the other called “Child”. The Parent program will launch the Child program and will receive data from the child.**
  
-Parmi toutes les questions que je reçois sur l'utilisation de Page, la plus courante est comment créer un programme avec plusieurs formulaires. La réponse à cela est vraiment très simple, mais elle n'est pas aussi directe que ce que pourrait penser l'utilisateur, d'où les questions. La question suivante est comment je fait en sorte que les formulaires ou les fenêtres se communiquent entre eux. Mon cher ami Halvard de Norvège m'a demandé comment faire pour qu'un formulaire lise une information dans un autre formulaire en « temps réel ». À nouveau, alors que la réponse est simple, ce n'est pas quelque chose que les utilisateurs essaient avant de poser leur question. Aussi, dans ce numéro, j'ai l'intention de présenter une démo simple pour aider à comprendre le processus. ET, s'y ajoute un bénéfice : cette solution n'est pas limitée au programme d'affichage graphique Page. Elle peut être utilisée pour n'importe quel programme en Python, même avec ceux en ligne de commande. Votre imagination est la seule limitation.+Parmi toutes les questions que je reçois sur l'utilisation de Page, la plus courante est comment créer un programme avec plusieurs formulaires. La réponse à cela est vraiment très simple, mais elle n'est pas aussi directe que ce que pourrait penser l'utilisateur, d'où les questions. La question suivante est comment je fais en sorte que les formulaires ou les fenêtres communiquent entre eux. Mon cher ami Halvard de Norvège m'a demandé comment faire pour qu'un formulaire lise une information dans un autre formulaire en « temps réel ». À nouveau, alors que la réponse est simple, ce n'est pas quelque chose que les utilisateurs essaient avant de poser leur question. Aussi, dans ce numéro, j'ai l'intention de présenter une démo simple pour aider à comprendre le processus. ET, s'y ajoute un bénéfice : cette solution n'est pas limitée au programme d'affichage graphique Page. Elle peut être utilisée pour n'importe quel programme en Python, même avec ceux en ligne de commande. Votre imagination est la seule limitation.
  
 Aussi, j'ai pensé mettre sur pied une rapide démo en utilisant Page pour montrer comment gérer les deux idées. Je vais utiliser Page car le programme est beaucoup plus facile à montrer en affichage graphique et parce que la première question a trait aux programmes Pages avec plusieurs formulaires. Aussi, j'ai pensé mettre sur pied une rapide démo en utilisant Page pour montrer comment gérer les deux idées. Je vais utiliser Page car le programme est beaucoup plus facile à montrer en affichage graphique et parce que la première question a trait aux programmes Pages avec plusieurs formulaires.
Ligne 35: Ligne 35:
 btnLaunch has the command attribute set to “on_btnLaunch” and the btnExit has the command attribute set to “on_btnExit”. These are the names of the callback functions for each of the buttons. The only other in the top_level form is the title of “I am Parent”.** btnLaunch has the command attribute set to “on_btnLaunch” and the btnExit has the command attribute set to “on_btnExit”. These are the names of the callback functions for each of the buttons. The only other in the top_level form is the title of “I am Parent”.**
  
-Comme vous pouvez le voir, le formulaire est très simple. Deux boutons et quatre étiquettes. Les deux boutons ont pour nom ou alias (de gauche à droite) btnLaunch et btnExit. Puis il y a deux étiquettes statiques (status et received) et deux étiquettes dynamiques ; l'une est un simple carré coloré qui montre l'état de la connexion au formulaire enfant et l'autre (qui se présente sous la forme d'un champ nervuré raffiné) a une variable de type texte appelée DataReceived, pour être ainsi facilement mis à jour par programmation. Comme le suggère son nom de variable, il contiendra les données qui arriveront du formulaire enfant. Avant de sauvegarder le formulaire, je l'ai déplacé vers la gauche au milieu de l'écran. La forme enfant se positionnera à droite au milieu de l'écran.+Comme vous pouvez le voir, le formulaire est très simple. Deux boutons et quatre étiquettes. Les deux boutons ont pour nom ou alias (de gauche à droite) btnLaunch et btnExit. Puis il y a deux étiquettes statiques (status et received) et deux étiquettes dynamiques ; l'une est un simple carré coloré qui montre l'état de la connexion au formulaire enfant et l'autre (qui se présente sous la forme d'un champ nervuré raffiné) a une variable de type texte appelée DataReceived, pour être ainsi facilement mise à jour par programmation. Comme le suggère son nom de variable, elle contiendra les données qui arriveront du formulaire enfant. Avant de sauvegarder le formulaire, je l'ai déplacé vers la gauche au milieu de l'écran. La forme enfant se positionnera à droite au milieu de l'écran.
  
 btnLaunch a l'attribut de commande positionné sur « on_btnLaunch » et l'attribut de commande de btnExit est paramétré sur « on_btnExit ». Ce sont les noms de fonctions de rappel de chacun des boutons. La seule autre chose dans le formulaire top_level (de niveau haut) est le titre « I am Parent » (Je suis le Parent). btnLaunch a l'attribut de commande positionné sur « on_btnLaunch » et l'attribut de commande de btnExit est paramétré sur « on_btnExit ». Ce sont les noms de fonctions de rappel de chacun des boutons. La seule autre chose dans le formulaire top_level (de niveau haut) est le titre « I am Parent » (Je suis le Parent).
Ligne 53: Ligne 53:
 Les trois boutons complémentaires ont leurs attributs de commande paramétrés sur on_btnClear, on_btnBackspace et on_btnEnter, qui sont, là encore, des fonctions de rappel, et le bouton Exit a son attribut de commande paramétré sur on_btnExit. Les trois boutons complémentaires ont leurs attributs de commande paramétrés sur on_btnClear, on_btnBackspace et on_btnEnter, qui sont, là encore, des fonctions de rappel, et le bouton Exit a son attribut de commande paramétré sur on_btnExit.
  
-Les 11 boutons du pavé n'utilisent pas d'attributs de commande paramétrés, car il est plus facile de paramétrer des fonctions de rappel, qui nécessitent un paramètre contenant le bouton sur lequel on a cliqué, en utilisant la commande bind ce que nous verrons dans quelques minutes. Nous paramétrerons les liaisons dans le module _support.+Les 11 boutons du pavé n'utilisent pas d'attributs de commande paramétrés, car il est plus facile de paramétrer des fonctions de rappel, qui nécessitent un paramètre contenant le bouton sur lequel on a cliqué, en utilisant la commande bindce que nous verrons dans quelques minutes. Nous paramétrerons les liaisons dans le module _support.
  
 **The Communications Magic **The Communications Magic
Ligne 126: Ligne 126:
 First, we set two global variables, comm1 which is the handle for the timer, and LblStat which is the alias for our little red square. Next, we access the shared module to see if the child process is running by checking shared.child_active to see if it’s True. This is set as soon as the child program starts up. If it is, we set the square colored label to “Green” to show that the child process is running and then we check to see if shared.ReadyToRead is set to True – which is basically a flag that says that one of the numeric keys has been clicked. If it is, we get that data, put it into the display label with the .set() method, and clear the ReadyToRead flag, so we can wait for the next click event on the child process. If the shared.child_active flag is False, we reset the coloured square to Red. This way, when the child program is exited, we will know it visually.** First, we set two global variables, comm1 which is the handle for the timer, and LblStat which is the alias for our little red square. Next, we access the shared module to see if the child process is running by checking shared.child_active to see if it’s True. This is set as soon as the child program starts up. If it is, we set the square colored label to “Green” to show that the child process is running and then we check to see if shared.ReadyToRead is set to True – which is basically a flag that says that one of the numeric keys has been clicked. If it is, we get that data, put it into the display label with the .set() method, and clear the ReadyToRead flag, so we can wait for the next click event on the child process. If the shared.child_active flag is False, we reset the coloured square to Red. This way, when the child program is exited, we will know it visually.**
  
-En bas à droite, voici le code de la fonction de rappel...+En bas à droite, voici le code de la fonction de rappel :
  
-D'abord, nous paramétrons deux variables globales, comm1 qui est le handle du compteur et LblStat qui est l'alias de notre petit carré rouge. Ensuite, nous accédons au module partagé pour voir si le processus enfant tourne en vérifiant si shared.child_active vaut True (Vrai). Il est ainsi dès que le programme enfant démarre. Si c'est le cas, nous réglons le carré coloré sur « Green » (Vert) pour montrer que le programe enfant tourne, puis nous vérifions si shared.ReadyToRead est positionné sur True - c'est en gros un drapeau qui dit qu'une des touches numériques a été cliquée. Si c'est le cas, nous recevons les données, les mettons dans l'étiquette d'affichage avec la méthode .set() et effaçons le drapeau ReadyToRead de façon à attendre le prochain événement de clic dans le processus enfant. Si le drapeau shared.child_active est False (Faux), nous remettons la couleur du carré à Red (Rouge). De cette façon, quand le programme enfant se terminera, nous le saurons visuellement.+D'abord, nous paramétrons deux variables globales, comm1 qui est le handle du compteur et LblStat qui est l'alias de notre petit carré rouge. Ensuite, nous accédons au module partagé pour voir si le processus enfant tourne en vérifiant si shared.child_active vaut True (Vrai). Il en est ainsi dès que le programme enfant démarre. Si c'est le cas, nous réglons le carré coloré sur « Green » (Vert) pour montrer que le programe enfant tourne, puis nous vérifions si shared.ReadyToRead est positionné sur True - c'est en gros un drapeau qui dit qu'une des touches numériques a été cliquée. Si c'est le cas, nous recevons les données, les mettons dans l'étiquette d'affichage avec la méthode .set() et effaçons le drapeau ReadyToRead de façon à attendre le prochain événement de clic dans le processus enfant. Si le drapeau shared.child_active est False (Faux), nous remettons la couleur du carré à Red (Rouge). De cette façon, quand le programme enfant se terminera, nous le saurons visuellement.
  
 **Finally, we “re-arm” the timer routine, this time to check 100 ms from that point. **Finally, we “re-arm” the timer routine, this time to check 100 ms from that point.
Ligne 170: Ligne 170:
 import shared import shared
  
-En haut à droite, voici la définition de l'étiquette qui montre la valeur courante venant des saisies sur les boutons du pavé numérique.+En haut à droite, voici la définition de l'étiquette qui montre la valeur courante venant des saisies sur les boutons du pavé numérique :
  
 La première chose que nous faisons est de paramétrer une variable globale pour garder la valeur cumulative des saisies du pavé. Ensuite, nous appelons la fonction setup_bindings() qui relie la fonction de rappel à tous les boutons du pavé. Enfin, nous paramétrons le drapeau shared.child_active à True. La première chose que nous faisons est de paramétrer une variable globale pour garder la valeur cumulative des saisies du pavé. Ensuite, nous appelons la fonction setup_bindings() qui relie la fonction de rappel à tous les boutons du pavé. Enfin, nous paramétrons le drapeau shared.child_active à True.
issue155/python.1585994397.txt.gz · Dernière modification : 2020/04/04 11:59 de auntiee