Outils pour utilisateurs

Outils du site


issue149: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
issue149:python [2019/10/10 14:40] auntieeissue149:python [2019/10/10 16:14] (Version actuelle) andre_domenech
Ligne 5: Ligne 5:
 De temps en temps, j'aide Don Rozenberg, le créateur de Page (un concepteur d'interface graphique « GUI » en Python) en faisant des tests, des démos, des tutoriels et du support. Cette semaine, j'ai eu un utilisateur qui avait un problème avec les gadgets à thème de ttk. Don m'a passé la question et j'ai dû batailler, car je n'avais pas utilisé les gadgets spécifiques de ttk depuis longtemps.  De temps en temps, j'aide Don Rozenberg, le créateur de Page (un concepteur d'interface graphique « GUI » en Python) en faisant des tests, des démos, des tutoriels et du support. Cette semaine, j'ai eu un utilisateur qui avait un problème avec les gadgets à thème de ttk. Don m'a passé la question et j'ai dû batailler, car je n'avais pas utilisé les gadgets spécifiques de ttk depuis longtemps. 
  
-Si vous ne connaissez pas les gadgets de ttk, c'est un ensemble de gadgets complémentaires disponibles pour Tkinter dans la boîte à outils Tk, qui fait partie de Tcl. La boîte à outils Tk est disponible pour Perl et Ruby ainsi que pour Tcl et Python. La portion pour ttk de la boîte à outils donne des gadgets de remplacement pour beaucoup de gadgets Tk standards… +Si vous ne connaissez pas les gadgets de ttk, c'est un ensemble de gadgets complémentaires disponibles pour Tkinter dans la boîte à outils Tk, qui fait partie de Tcl. La boîte à outils Tk est disponible pour Perl et Ruby ainsi que pour Tcl et Python. La portion pour ttk de la boîte à outils donne des gadgets de remplacement pour beaucoup de gadgets Tk standards... 
  
 **They pretty much act as the standard widgets do, they just have a different, more updated look to them (at least to some people). There are also preset styles that you can use that changes the look of them. On Linux machines, there are 4 pre-defined styles, named clam, alt, default and classic). On Windows machines, there are three others as well, called “winnative’, ‘vista’ and ‘xpnative’. And Mac users have other choices, but the bottom line there are on all platforms, the 4 base styles that are on Linux. **They pretty much act as the standard widgets do, they just have a different, more updated look to them (at least to some people). There are also preset styles that you can use that changes the look of them. On Linux machines, there are 4 pre-defined styles, named clam, alt, default and classic). On Windows machines, there are three others as well, called “winnative’, ‘vista’ and ‘xpnative’. And Mac users have other choices, but the bottom line there are on all platforms, the 4 base styles that are on Linux.
Ligne 13: Ligne 13:
 Ils fonctionnent de façon assez similaire aux gadgets standards ; ils ont surtout un aspect différent, plus à jour (du moins selon certaines personnes). Ils disposent aussi de thèmes pré-réglés que vous pouvez utiliser pour changer leur aspect. Sur les machines Linux, il y a 4 styles prédéfinis, appelés clam, alt, default et classic). Sur les machines Windows, il y en a aussi trois autres, appelés « winnative », « vista » et « xpnative ». Et les utilisateurs de MAC ont d'autres choix, mais les 4 styles de base sous Linux sont le minimum disponible sur toutes les machines. Ils fonctionnent de façon assez similaire aux gadgets standards ; ils ont surtout un aspect différent, plus à jour (du moins selon certaines personnes). Ils disposent aussi de thèmes pré-réglés que vous pouvez utiliser pour changer leur aspect. Sur les machines Linux, il y a 4 styles prédéfinis, appelés clam, alt, default et classic). Sur les machines Windows, il y en a aussi trois autres, appelés « winnative », « vista » et « xpnative ». Et les utilisateurs de MAC ont d'autres choix, mais les 4 styles de base sous Linux sont le minimum disponible sur toutes les machines.
  
-Quand je fais une interface utilisateur, j'évite habituellement les gadgets ttk dans l'ensemble, parce qu'ils ont moins d'attributs « visibles » que les gadgets standards et j'ai l'impression de perdre la maîtrise de mon programme. Voici un exemple utilisant l'éditeur d'attribut de Page+Quand je fais une interface utilisateur, j'évite habituellement les gadgets ttk dans l'ensemble, parce qu'ils ont moins d'attributs « visibles » que les gadgets standards et j'ai l'impression de perdre la maîtrise de mon programme. Voici un exemple utilisant l'éditeur d'attribut de Page :
  
 **I know this graphic is mostly unreadable, but it is illustrative of the number of attributes that you can control for a standard button (on the left side) compared to the ttk button (on the right). Part of the discrepancy stems from the fact that the style controls most of the attributes that seem to be missing. In a good way, this is a good thing. On the other hand, since the style is “taking care of these attributes for you”, for the most part the style keeps you from making changes to what could normally be an important attribute when you are trying to “push the envelope” and make your GUI program look more modern than standard Tkinter widgets allow. **I know this graphic is mostly unreadable, but it is illustrative of the number of attributes that you can control for a standard button (on the left side) compared to the ttk button (on the right). Part of the discrepancy stems from the fact that the style controls most of the attributes that seem to be missing. In a good way, this is a good thing. On the other hand, since the style is “taking care of these attributes for you”, for the most part the style keeps you from making changes to what could normally be an important attribute when you are trying to “push the envelope” and make your GUI program look more modern than standard Tkinter widgets allow.
Ligne 19: Ligne 19:
 While the above might dissuade many users from even trying ttk widgets, a larger number of users are overwhelmed by how hard it is to find really good documentation on the use and customization of ttk widgets. Even those sites on the Internet that touch on how to do it, only give a small amount of information and even then, there isn’t much about using ttk goodies in Page. So, I thought I’d try to fix this in some small way.** While the above might dissuade many users from even trying ttk widgets, a larger number of users are overwhelmed by how hard it is to find really good documentation on the use and customization of ttk widgets. Even those sites on the Internet that touch on how to do it, only give a small amount of information and even then, there isn’t much about using ttk goodies in Page. So, I thought I’d try to fix this in some small way.**
  
-Je sais que cette image est à peu près illisible, mais elle illustre bien le nombre d'attributs que vous pouvez contrôler pour un bouton ordinaire (sur le côté gauche) par rapport à un bouton ttk (à droite). Une partie de la différence vient du fait que le style contrôle la plupart des attributs qui semblent manquer. D'une certaine manière, c'est une bonne chose, car le style « s'occupe des attributs à votre place » ; majoritairement, le style vous empêche de faire des modifications à ce qui pourrait être un attribut important quand vous essayez de « gagner de la place » pour donner à votre programme d'interface un aspect plus moderne que ce qu'autorise les gadgets Tkinter standards.+Je sais que cette image est à peu près illisible, mais elle illustre bien le nombre d'attributs que vous pouvez contrôler pour un bouton ordinaire (sur le côté gauche) par rapport à un bouton ttk (à droite). Une partie de la différence vient du fait que le style contrôle la plupart des attributs qui semblent manquer. D'une certaine manière, c'est une bonne chose, car le style « s'occupe des attributs à votre place » ; majoritairement, le style vous empêche de faire des modifications à ce qui pourrait être un attribut important quand vous essayez de « gagner de la place » pour donner à votre programme d'interface un aspect plus moderne que ce qu'autorisent les gadgets Tkinter standards.
  
 Bien que cela puisse dissuader certains utilisateurs de donner une chance aux gadgets ttk, un grand nombre d'utilisateurs sont dépassés devant la difficulté de trouver une bonne documentation sur l'utilisation et la personnalisation des gadgets ttk. Même sur les sites d'Internet qui parlent de comment faire, la quantité d'information fournie est faible et, même là, il n'y a pas grand chose sur l'utilisation des petits trucs en ttk dans Page. Aussi, je pensais que j'allais essayer de résoudre le problème au moins un peu. Bien que cela puisse dissuader certains utilisateurs de donner une chance aux gadgets ttk, un grand nombre d'utilisateurs sont dépassés devant la difficulté de trouver une bonne documentation sur l'utilisation et la personnalisation des gadgets ttk. Même sur les sites d'Internet qui parlent de comment faire, la quantité d'information fournie est faible et, même là, il n'y a pas grand chose sur l'utilisation des petits trucs en ttk dans Page. Aussi, je pensais que j'allais essayer de résoudre le problème au moins un peu.
Ligne 67: Ligne 67:
 Our code will be pretty minimal. We'll start with fleshing out the on_rbClick() function. This is a callback function that fires whenever the user clicks on one of the TRadiobuttons. Code is shown on the next page, top right.** Our code will be pretty minimal. We'll start with fleshing out the on_rbClick() function. This is a callback function that fires whenever the user clicks on one of the TRadiobuttons. Code is shown on the next page, top right.**
  
-Si tout s'est bien déroulé pendant la création du GUI, Page devrait avoir créé pour vous les fonctions suivantes+Si tout s'est bien déroulé pendant la création du GUI, Page devrait avoir créé pour vous les fonctions suivantes :
  
 set_Tk_var() set_Tk_var()
Ligne 84: Ligne 84:
 Next we repeat the operation in the print statement that gets the value of that TRadiobutton and finally, we tell ttk to use the correct style to draw the widgets. This happens immediately.** Next we repeat the operation in the print statement that gets the value of that TRadiobutton and finally, we tell ttk to use the correct style to draw the widgets. This happens immediately.**
  
-Page a incorporé les deux premières déclarations (print(...) et sys.stdout.flush()) à votre place. Ainsi, la première ligne de notre code imprime la valeur du TRadiobutton que nous avons entrée dans l'attribut « value » du gadget quand nous faisions la mise en forme dans Page. De cette façon, le programme connait quel bouton a été cliqué. La ligne suivante obtient les styles que ttk supporte dans ce système d'exploitation. Dans Linux, il y a quatre éléments et dans Windows, il y en a 7 ; ils sont retournés comme un tuple, comme ceci+Page a incorporé les deux premières déclarations (print(...) et sys.stdout.flush()) à votre place. Ainsi, la première ligne de notre code imprime la valeur du TRadiobutton que nous avons entrée dans l'attribut « value » du gadget quand nous faisions la mise en forme dans Page. De cette façon, le programme connaît quel bouton a été cliqué. La ligne suivante obtient les styles que ttk supporte dans ce système d'exploitation. Dans Linux, il y a quatre éléments et dans Windows, il y en a 7 ; ils sont retournés comme un tuple, comme ceci :
  
 ('clam', 'alt', 'default', 'classic') ('clam', 'alt', 'default', 'classic')
Ligne 103: Ligne 103:
 setup_styles()** setup_styles()**
  
-Maintenant, nous incorporons l'appel on_btnExit() dans le code… +Maintenant, nous incorporons l'appel on_btnExit() dans le code :
 def on_btnExit(): def on_btnExit():
         print('ttkdemo_support.on_btnExit')         print('ttkdemo_support.on_btnExit')
Ligne 157: Ligne 156:
         cntr += 1**         cntr += 1**
                  
-Maintenant, nous créons une fonction dans notre fonction qui efface les champs de texte et désactive les 7 boutons radio. Je suis sûr que vous comprenez pourquoi nous effaçons les champs de texte, et la raison pour laquelle nous désactivons tous les boutons gadgets TRadiobuttons à cet endroit vient du fait que, si nous fonctionnons sous Linux, l'utilisateur ne peux pas cliquer les boutons 5 à 7, alors que si nous sommes sous Windows, les 7 boutons seront tous activés dans le prochain bout de code. Bienvenus dans la programmation multi-plateforme !+Maintenant, nous créons une fonction dans notre fonction qui efface les champs de texte et désactive les 7 boutons radio. Je suis sûr que vous comprenez pourquoi nous effaçons les champs de texte, et la raison pour laquelle nous désactivons tous les boutons gadgets TRadiobuttons à cet endroit vient du fait que, si nous fonctionnons sous Linux, l'utilisateur ne peut pas cliquer les boutons 5 à 7, alors que si nous sommes sous Windows, les 7 boutons seront tous activés dans le prochain bout de code. Bienvenue dans la programmation multi-plateforme !
  
     clear_radio_buttons()     clear_radio_buttons()
Ligne 176: Ligne 175:
 w.TProgressbar1.start()** w.TProgressbar1.start()**
  
-Nous utiliserons une simple boucle for pour le faire. Nous utiliserons, à nouveau, la liste que nous avons créé de tous les gadgets TRadiobutton pour obtenir le vrai nom d'objet du gadget, paramétrerons son texte suivant le nom du style pour cette place dans la boucle et reparamétrerons l'état à « normal ».+Nous utiliserons une simple boucle for pour le faire. Nous utiliserons, à nouveau, la liste que nous avons créée de tous les gadgets TRadiobutton pour obtenir le vrai nom d'objet du gadget, paramétrerons son texte suivant le nom du style pour cette place dans la boucle et reparamétrerons l'état à « normal ».
  
 Enfin, nous paramétrerons la barre TProgress pour qu'elle fasse quelque chose. La barre de progression a deux modes, « determinate » (déterminé) quand vous savez où vous en êtes dans le déroulement du processus et que vous voulez montrer un pourcentage de cet avancement. Le mode « indeterminate » (indéterminé) amène la barre à simplement avancer/reculer pour montrer que quelque chose se passe. Vous utilisez la méthode « .start() » pour commencer le mouvement et la méthode « .stop() » pour l'arrêter. Nous utiliserons la méthode « indeterminate » juste pour le plaisir. Enfin, nous paramétrerons la barre TProgress pour qu'elle fasse quelque chose. La barre de progression a deux modes, « determinate » (déterminé) quand vous savez où vous en êtes dans le déroulement du processus et que vous voulez montrer un pourcentage de cet avancement. Le mode « indeterminate » (indéterminé) amène la barre à simplement avancer/reculer pour montrer que quelque chose se passe. Vous utilisez la méthode « .start() » pour commencer le mouvement et la méthode « .stop() » pour l'arrêter. Nous utiliserons la méthode « indeterminate » juste pour le plaisir.
Ligne 192: Ligne 191:
 That was easy and pretty much painless. As always, I've put all the code up on pastebin at the following links...** That was easy and pretty much painless. As always, I've put all the code up on pastebin at the following links...**
  
-Ça y est. Sauvegardez votre programme et vous pouvez le lancer dans Python. Maintenant, chaque fois que vous voulez utiliser des gadgets ttk dans votre GUI, vous savez à quoi ils ressembleront quel que soit le style et une fois que vous en avez choisi un à votre goût, vous pouvez mettre les lignes suivantes quelque part dans la fonction init() (après les quatre premières lignes)+Ça y est. Sauvegardez votre programme et vous pouvez le lancer dans Python. Maintenant, chaque fois que vous voulez utiliser des gadgets ttk dans votre GUI, vous savez à quoi ils ressembleront quel que soit le style et une fois que vous en avez choisi un à votre goût, vous pouvez mettre les lignes suivantes quelque part dans la fonction init() (après les quatre premières lignes) :
  
 style = ttk.Style() style = ttk.Style()
     style.theme_use(‘votre_style_ici’)     style.theme_use(‘votre_style_ici’)
          
-C'était facile et pratiquement sans difficulté. Comme toujours, j'ai mis le code sur pastebin aux liens suivants+C'était facile et pratiquement sans difficulté. Comme toujours, j'ai mis le code sur pastebin aux liens suivants :
  
 **ttkdemo.tcl - https://pastebin.com/yFnH6QXF **ttkdemo.tcl - https://pastebin.com/yFnH6QXF
issue149/python.txt · Dernière modification : 2019/10/10 16:14 de andre_domenech