Outils pour utilisateurs

Outils du site


issue177: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
issue177:python [2022/01/31 14:07] d52frissue177:python [2022/02/01 16:16] (Version actuelle) andre_domenech
Ligne 11: Ligne 11:
 Bonne année ! Espérons que 2022 nous apportera à tous de grandes choses. Bonne année ! Espérons que 2022 nous apportera à tous de grandes choses.
  
-Comme la plupart d'entre vous le savent, je travaille en étroite collaboration avec Don Rozenberg qui a créé PAGE, un concepteur d'interface graphique pour Python. Le 24 décembre 2021, Don a publié la version 7 de PAGE. Cependant, la dernière version ressemble presque exactement à la version précédente lorsque vous regardez simplement l'interface. La majorité des changements se trouvent sous le capot. Jetons un coup d'oeil rapide aux parties de l'interface qui ont changé...+Comme la plupart d'entre vous le savent, je travaille en étroite collaboration avec Don Rozenberg qui a créé PAGE, un concepteur d'interface graphique pour Python. Le 24 décembre 2021, Don a publié la version 7 de PAGE. Cependant, la dernière version ressemble presque exactement à la version précédente lorsque vous regardez tout simplement l'interface. La majorité des changements se trouve sous le capot. Jetons un coup d'œil rapide aux parties de l'interface qui ont changé...
  
 La première chose que vous remarquerez probablement est qu'il existe une nouvelle option en haut de la boîte à outils. La première chose que vous remarquerez probablement est qu'il existe une nouvelle option en haut de la boîte à outils.
Ligne 30: Ligne 30:
 Il est beaucoup plus complet et fonctionnel. Il est beaucoup plus complet et fonctionnel.
  
-L'une des autres nouveautés (parmi tant d'autres) ne sera visible que si vous ouvrez le menu des préférences (illustré en bas au milieu).+L'une des nouveautés (parmi tant d'autres) ne sera visible que si vous ouvrez le menu des préférences (illustré en bas au milieu).
  
 Dans l'onglet Polices, une nouvelle zone de saisie vous permet d'ajouter des tailles de police supplémentaires dans la boîte de dialogue Police, remaniée. Bien qu'il soit possible de choisir une taille de police unique pour un usage particulier, vous pouvez utiliser la fonction Ajouter des tailles de police personnalisées pour choisir des tailles de police adaptées à vos besoins.   Dans l'onglet Polices, une nouvelle zone de saisie vous permet d'ajouter des tailles de police supplémentaires dans la boîte de dialogue Police, remaniée. Bien qu'il soit possible de choisir une taille de police unique pour un usage particulier, vous pouvez utiliser la fonction Ajouter des tailles de police personnalisées pour choisir des tailles de police adaptées à vos besoins.  
  
-Il y a une multitude de changements dans l'interface utilisateur que nous n'aborderons pas pour l'instant puisque nous allons présenter la plus grande chose qui a changé dans PAGE 7.0. Je vais les mettre de côté, à vous de les trouver, et je pourrais en aborder certains dans de futurs articles.  À mon avis, le plus grand changement est le moteur de création de code, qui prend les informations natives .tk du concepteur d'interface graphique et les transforme en code Python. Il a considérablement changé. Don l'a pratiquement réécrit à partir de zéro.+Il y a une multitude de changements dans l'interface utilisateur que nous n'aborderons pas pour l'instant puisque nous allons présenter la chose la plus importante qui a changé dans PAGE 7.0. Je vais les mettre de côté, à vous de les trouver, et je pourrais en aborder certains dans de futurs articles. À mon avis, le plus grand changement est le moteur de création de code, qui prend les informations natives .tk du concepteur d'interface graphique et les transforme en code Python. Il a changé de façon significative. Don l'a pratiquement réécrit à partir de zéro.
  
  
Ligne 59: Ligne 59:
 Dans le module de support, PAGE 6 avait une fonction de démarrage appelée init qui était la toute dernière chose qui était exécutée avant que l'utilisateur ne voie le formulaire (en bas à gauche). Dans le module de support, PAGE 6 avait une fonction de démarrage appelée init qui était la toute dernière chose qui était exécutée avant que l'utilisateur ne voie le formulaire (en bas à gauche).
  
-Chaque formulaire avait cette même fonction. Pour référencer directement un widget, nous devions utiliser w.widgetname pour accéder à ce widget. Ceci ne s'appliquait pas aux variables Tk, seulement aux widgets.+Chaque formulaire avait cette même fonction. Pour référencer directement un widget, nous devions utiliser w.widgetname pour accéder à ce widget. Cela ne s'appliquait pas aux variables Tk, seulement aux widgets.
  
  
Ligne 66: Ligne 66:
 Both of the Label widgets have the same TK variable name DynLabel which, while not very good programming practice, is easy to do without thinking and under PAGE version 6 and below was completely reasonable.  PAGE has had a feature called “borrow” for a long time and in version 7 has been enhanced to allow you to “borrow” forms and widgets from an earlier project that had multiple forms easily.  All widgets and their variables can be imported into the new project. In order to keep this from being a problem, PAGE separates each form into its own class within the GUI module.  Shown right is a quick snippet of what the GUI contains in version 7.** Both of the Label widgets have the same TK variable name DynLabel which, while not very good programming practice, is easy to do without thinking and under PAGE version 6 and below was completely reasonable.  PAGE has had a feature called “borrow” for a long time and in version 7 has been enhanced to allow you to “borrow” forms and widgets from an earlier project that had multiple forms easily.  All widgets and their variables can be imported into the new project. In order to keep this from being a problem, PAGE separates each form into its own class within the GUI module.  Shown right is a quick snippet of what the GUI contains in version 7.**
  
-Comme PAGE 7 permet d'avoir plusieurs formulaires dans un module de code, il a fallu modifier le paradigme, car la possibilité de conflits de variables est devenue une préoccupation très réelle. Supposons que vous ayez deux formulaires ayant chacun un widget Label qui possède une variable texte appelée « LabelDisplay ». Si cela se produisait, vous ne pourriez pas être sûr que le texte du widget Étiquette serait modifié. Afin d'éviter que cela ne se produise, Don a trouvé une façon très créative d'éviter cela. Voici un programme simple à deux formulaires qui montre à quel point il est facile de s'en occuper (en bas à droite).+Comme PAGE 7 permet d'avoir plusieurs formulaires dans un module de code, il a fallu modifier le paradigme, car la possibilité de conflits de variables est devenue une préoccupation très réelle. Supposons que vous ayez deux formulaires ayant chacun un widget Label qui possède une variable texte appelée « LabelDisplay ». Si cela se produisait, vous ne pourriez pas être sûr que le texte du widget Label serait modifié. Afin d'éviter que cela ne se produise, Don a trouvé une façon très créative de l'éviter. Voici un programme simple à deux formulaires qui montre à quel point il est facile de s'en occuper (en bas à droite).
  
-Les deux widgets Label ont le même nom de variable TK DynLabel, ce qui, bien que ce ne soit pas une très bonne pratique de programmation, est facile à faire sans réfléchir et, sous PAGE version 6 et inférieure, était tout à fait raisonnable. La version 7 a été améliorée pour vous permettre d'« emprunter » des formulaires et des widgets d'un projet antérieur qui comportait plusieurs formulaires. Tous les widgets et leurs variables peuvent être importés dans le nouveau projet. Afin d'éviter que cela ne pose problème, PAGE sépare chaque formulaire dans sa propre classe au sein du module GUI. La photo de droite montre un extrait rapide de ce que contient le GUI dans la version 7.+Les deux widgets Label ont le même nom de variable TK DynLabel, ce qui, bien que ce ne soit pas une très bonne pratique de programmation, est facile à faire sans réfléchir et, sous PAGE version 6 et inférieure, était tout à fait raisonnable. La version 7 a été améliorée pour vous permettre d'« emprunter » des formulaires et des widgets d'un projet antérieur qui comportait plusieurs formulaires. Tous les widgets et leurs variables peuvent être importés dans le nouveau projet. Afin d'éviter que cela ne pose problème, PAGE sépare chaque formulaire dans sa propre classe au sein du module GUI. À droite, vous trouverez un extrait rapide de ce que contient le GUI dans la version 7.
  
  
Ligne 87: Ligne 87:
 Puisque chaque formulaire est maintenant défini comme une classe distincte, les noms des variables peuvent facilement être les mêmes entre les formulaires. Je vous montrerai (en haut à droite) comment on y accède dans un instant. Pour l'instant, jetons un coup d'oeil aux changements apportés au module de support. Il n'y a plus de fonction init, elle s'appelle maintenant main. Puisque chaque formulaire est maintenant défini comme une classe distincte, les noms des variables peuvent facilement être les mêmes entre les formulaires. Je vous montrerai (en haut à droite) comment on y accède dans un instant. Pour l'instant, jetons un coup d'oeil aux changements apportés au module de support. Il n'y a plus de fonction init, elle s'appelle maintenant main.
  
-Le V7 dans le bout de code du haut à droite est le vrai nom du projet. Chaque formulaire a maintenant un alias qui commence par _w et ensuite un numéro pour faire référence au formulaire, donc _w1 est l'alias pour les widgets du formulaire 1 et _w2 fait référence à ceux du formulaire 2.+Le V7 dans le bout de code en haut à droite est le vrai nom du projet. Chaque formulaire a maintenant un alias qui commence par _w et ensuite un numéro pour faire référence au formulaire, donc _w1 est l'alias pour les widgets du formulaire 1 et _w2 fait référence à ceux du formulaire 2.
  
-Pour modifier le texte de l'étiquette du premier formulaire, il suffit d'utiliser le code suivant.+Pour modifier le texte de l'étiquette du premier formulaire, il suffit d'utiliser le code suivant :
  
 _w1.DynLabel.set("Texte") _w1.DynLabel.set("Texte")
  
-Et pour changer le texte de l'étiquette sur le deuxième formulaire, nous utiliserions le code suivant.+Et pour changer le texte de l'étiquette sur le deuxième formulaire, nous utiliserions le code suivant :
  
 _w2.DynLabel.set("Autre Texte") _w2.DynLabel.set("Autre Texte")
Ligne 103: Ligne 103:
 When you run a multiform project created with version 7, you might be surprised to see that all the forms show right away.  If you look at the code again, you can see why.  All of the forms get created at startup and when the root.mainloop line gets run, it shows everything that has been defined.  Sometimes, that is the desired action and that’s ok.  However, if you have an application that you want one form to be the main form and the others to only show on demand, that isn’t acceptable.  It’s really easy to address this though.  In version 6, I created two small functions in the support module that I called show_me and hide_me.  When my main form needed to show another form, I would call the hide_me function to minimize the main form and then I would call the show_me function to show the second form.  When the use of the second form was done, I would call the hide_me function for the second form and then the show_me function for the main form.  It was a logical set of steps for the purpose.  Here is what they looked like for version 6.** When you run a multiform project created with version 7, you might be surprised to see that all the forms show right away.  If you look at the code again, you can see why.  All of the forms get created at startup and when the root.mainloop line gets run, it shows everything that has been defined.  Sometimes, that is the desired action and that’s ok.  However, if you have an application that you want one form to be the main form and the others to only show on demand, that isn’t acceptable.  It’s really easy to address this though.  In version 6, I created two small functions in the support module that I called show_me and hide_me.  When my main form needed to show another form, I would call the hide_me function to minimize the main form and then I would call the show_me function to show the second form.  When the use of the second form was done, I would call the hide_me function for the second form and then the show_me function for the main form.  It was a logical set of steps for the purpose.  Here is what they looked like for version 6.**
  
-Pour terminer le programme dans la version 6, vous utiliseriez la fonction destroy_window() générée par PAGE. Dans la version 7, vous appelez simplement root.destroy(). L'appel de root à partir de votre code peut être problématique, car toutes les formes ont une racine. Cependant, l'appel de root.destroy() pour terminer le programme est correct, car il fermera toutes les fenêtres actives.+Pour terminer le programme dans la version 6, vous utilisiez la fonction destroy_window() générée par PAGE. Dans la version 7, vous appelez simplement root.destroy(). L'appel de root à partir de votre code peut être problématique, car toutes les formes ont une racine. Cependant, l'appel de root.destroy() pour terminer le programme est correct, car il fermera toutes les fenêtres actives.
  
-Lorsque vous exécutez un projet multiforme créé avec la version 7, vous pouvez être surpris de voir que tous les formulaires s'affichent immédiatement. Si vous regardez à nouveau le code, vous pouvez comprendre pourquoi. Tous les formulaires sont créés au démarrage et lorsque la ligne root.mainloop est exécutée, elle affiche tout ce qui a été défini. Parfois, c'est l'action souhaitée et c'est correct. Cependant, si vous avez une application pour laquelle vous voulez qu'un formulaire soit le formulaire principal et que les autres ne s'affichent que sur demande, ce n'est pas acceptable. Il est pourtant très facile de résoudre ce problème. Dans la version 6, j'ai créé deux petites fonctions dans le module de support que j'ai appelées show_me et hide_me.  Lorsque mon formulaire principal devait afficher un autre formulaire, j'appelais la fonction hide_me pour minimiser le formulaire principal, puis j'appelais la fonction show_me pour afficher le second formulaire. Lorsque l'utilisation du second formulaire était terminée, j'appelais la fonction hide_me pour le second formulaire, puis la fonction show_me pour le formulaire principal.  C'était un ensemble logique d'étapes pour le but recherché. Voici à quoi elles ressemblaient pour la version 6.+Lorsque vous exécutez un projet multiforme créé avec la version 7, vous pouvez être surpris de voir que tous les formulaires s'affichent immédiatement. Si vous regardez à nouveau le code, vous pouvez comprendre pourquoi. Tous les formulaires sont créés au démarrage et lorsque la ligne root.mainloop est exécutée, elle affiche tout ce qui a été défini. Parfois, c'est l'action souhaitée et c'est bien. Cependant, si vous avez une application pour laquelle vous voulez qu'un formulaire soit le formulaire principal et que les autres ne s'affichent que sur demande, ce n'est pas acceptable. Il est pourtant très facile de résoudre ce problème. Dans la version 6, j'ai créé deux petites fonctions dans le module de support que j'ai appelées show_me et hide_me. Lorsque mon formulaire principal devait afficher un autre formulaire, j'appelais la fonction hide_me pour minimiser le formulaire principal, puis j'appelais la fonction show_me pour afficher le second formulaire. Lorsque l'utilisation du second formulaire était terminée, j'appelais la fonction hide_me pour le second formulaire, puis la fonction show_me pour le formulaire principal.  C'était un ensemble logique d'étapes pour le but recherché. Voici à quoi elles ressemblaient dans la version 6.
  
 **def show_me(): **def show_me():
Ligne 143: Ligne 143:
     root.withdraw()     root.withdraw()
  
-Nous ne pouvons pas utiliser ces fonctions directement dans la version 7, car elles appellent toutes deux directement l'objet racine. Cependant, il est simple de les modifier pour qu'elles fonctionnent correctement. Il suffit de créer un ensemble pour chaque formulaire.+Nous ne pouvons pas utiliser ces fonctions directement dans la version 7, car elles appellent toutes deux directement l'objet racine. Cependant, il est simple de les modifier pour qu'elles fonctionnent correctement. Il suffit de créer un ensemble pour chaque formulaire :
  
 def show_me1(): def show_me1():
Ligne 161: Ligne 161:
     _w2.withdraw()     _w2.withdraw()
  
-Vous pouvez même créer un seul ensemble de fonctions qui gère un nombre quelconque de formulaires en passant l'objet comme paramètre à la fonction qui définit le formulaire avec lequel vous voulez travailler.+Vous pouvez même créer un seul ensemble de fonctions qui gère un nombre quelconque de formulaires en passant l'objet comme paramètre à la fonction qui définit le formulaire avec lequel vous voulez travailler :
  
  
Ligne 186: Ligne 186:
     which.withdraw()     which.withdraw()
  
-Pour ce faire, nous devons créer une fonction de démarrage qui s'exécute juste avant l'affichage des formulaires et l'appeler juste avant la dernière ligne de la fonction principale.+Pour l'utiliser, nous devons créer une fonction de démarrage qui s'exécute juste avant l'affichage des formulaires et l'appeler juste avant la dernière ligne de la fonction principale.
  
-Vous pouvez utiliser la fonction de démarrage (ou quel que soit le nom que vous lui donnez) pour faire des choses comme démarrer des bases de données ou initialiser divers paramètres et bibliothèques. Notre fonction de démarrage, dans ce cas, doit avoir au moins ceci.+Vous pouvez utiliser la fonction de démarrage (ou quel que soit le nom que vous lui donnez) pour faire des choses comme démarrer des bases de données ou initialiser divers paramètres et bibliothèques. Notre fonction de démarrage, dans ce cas, doit avoir au moins ceci :
  
 def startup(): def startup():
Ligne 210: Ligne 210:
 (Les lignes qui ne sont pas en gras font partie du nouveau squelette de fonction de rappel que PAGE crée). Cela cache le premier formulaire et affiche le second. Ensuite, pour que la fonction de rappel restaure le premier formulaire et cache le second, nous faisons ce qui suit (en bas à gauche). (Les lignes qui ne sont pas en gras font partie du nouveau squelette de fonction de rappel que PAGE crée). Cela cache le premier formulaire et affiche le second. Ensuite, pour que la fonction de rappel restaure le premier formulaire et cache le second, nous faisons ce qui suit (en bas à gauche).
  
-Super facile et propre. Tout ce dont vous devez vous souvenir est l'alias de formulaire que vous devez utiliser pour manipuler ce formulaire particulier.+Super facile et propre. Tout ce dont vous devez vous souvenir est l'alias de formulaire que vous devez utiliser pour manipuler ce formulaire précis.
  
-Je dois admettre qu'il m'a fallu un peu de temps avant de me sentir complètement à l'aise avec ces changements, mais ils ne sont pas aussi radicaux qu'il n'y paraît.+Je dois admettre qu'il m'a fallu un peu de temps avant de me sentir complètement à l'aise avec ces changements, mais ils ne sont pas aussi radicaux qu'il y paraît.
  
-Il y a un certain nombre d'autres changements dans la version 7 de PAGE qui améliorent vraiment les capacités, mais je ne vais pas tous les passer en revue maintenant. Si vous voulez avoir un moyen rapide et (assez) facile de créer des interfaces graphiques Tkinter pour vos programmes Python, vous devez vraiment obtenir la dernière version de PAGE. Vous pouvez la télécharger à partir de https://sourceforge.net/projects/page/+Il y a un certain nombre d'autres changements dans la version 7 de PAGE qui en améliorent vraiment les capacités, mais je ne vais pas tous les passer en revue maintenant. Si vous voulez avoir un moyen rapide et (assez) facile de créer des interfaces graphiques Tkinter pour vos programmes Python, vous devez vraiment obtenir la dernière version de PAGE. Vous pouvez la télécharger à partir de https://sourceforge.net/projects/page/
  
-En raison de tous les changements que PAGE 7 apporte à la table, j'ai écrit un nouveau tutoriel pour les nouveaux utilisateurs et un document qui montre un ensemble facile de conseils de migration pour ceux qui sont familiers avec les versions précédentes de PAGE. Les deux sont inclus dans chaque distribution de PAGE dans le dossier docs.+En raison de tous les changements que PAGE 7 apporte, j'ai écrit un nouveau tutoriel pour les nouveaux utilisateurs et un document qui montre un ensemble facile de conseils de migration pour ceux qui sont familiers avec les versions précédentes de PAGE. Les deux sont inclus dans chaque distribution de PAGE dans le dossier docs.
  
-Jusqu'à la prochaine fois, comme toujours restez en sécurité, en bonne santé, positif et créatif !+Jusqu'à la prochaine fois, comme toujoursrestez en sécurité, en bonne santé, positif et créatif !
  
issue177/python.txt · Dernière modification : 2022/02/01 16:16 de andre_domenech