Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente |
issue183:python [2022/07/31 09:10] – d52fr | issue183:python [2022/08/02 15:10] (Version actuelle) – andre_domenech |
---|
Désolé de ne pas avoir pu poursuivre le sujet le mois dernier, mais nous sommes de retour. Reprenons le projet là où nous l'avons laissé dans le numéro 181. Voici à quoi ressemble la dernière version du programme (image en bas à droite). | Désolé de ne pas avoir pu poursuivre le sujet le mois dernier, mais nous sommes de retour. Reprenons le projet là où nous l'avons laissé dans le numéro 181. Voici à quoi ressemble la dernière version du programme (image en bas à droite). |
| |
Juste pour vous rappeler qu'il y a trois paramètres de couleur possibles pour la plupart des widgets. Une couleur de fond sélectionnée, une couleur de fond active et une couleur de fond inactive. Voici comment ils fonctionnent... | Juste pour vous rappeler qu'il y a trois paramètres de couleurs possibles pour la plupart des widgets. Une couleur de fond sélectionnée, une couleur de fond active et une couleur de fond inactive. Voici comment ils fonctionnent... |
| |
Pour l'essentiel, cela concerne les onglets de TNotebook, mais il y a aussi des « reports » dans la plupart des autres widgets. | Pour l'essentiel, cela concerne les onglets de TNotebook, mais il y a aussi des « reports » dans la plupart des autres widgets. |
result = tkColorChooser.askcolor(color, option=value, ...)** | result = tkColorChooser.askcolor(color, option=value, ...)** |
| |
En regardant de plus près les couleurs d'arrière-plan de TLableframe (l'avant-plan fonctionne presque exactement de la même manière, à l'exception du traitement des couleurs d'avant-plan), nous allons nous concentrer sur le panneau d'arrière-plan pour le moment. | En regardant de plus près les couleurs d'arrière-plan de TLabelframe (l'avant-plan fonctionne presque exactement de la même manière, à l'exception du traitement des couleurs d'avant-plan), nous allons nous concentrer sur le panneau d'arrière-plan pour le moment. |
| |
Nous avons trois widgets de texte statique (ttk::Labels), trois widgets d'entrée (ttk:Entries), et trois boutons (Standard Tk::Buttons). Entre les widgets Entry et les boutons, nous pouvons choisir les couleurs que nous voulons essayer. Les trois boutons ont la même fonction de commande de rappel de base (lambda : on_bgColor(x) où x est le numéro du bouton). Cela permet à n'importe lequel des trois boutons d'appeler la même fonction, avec un index différent, afin que le programme sache quel bouton a fait l'appel. Les boutons appellent la boîte de dialogue ColorSelect. Si vous connaissez la couleur que vous voulez, vous pouvez la saisir directement dans la zone d'entrée de Labelframe ou utiliser la boîte de dialogue. La boîte de dialogue vous permet également d'utiliser les curseurs ou de saisir directement dans la zone d'entrée. | Nous avons trois widgets de texte statique (ttk::Labels), trois widgets d'entrée (ttk:Entries) et trois boutons (Standard Tk::Buttons). Entre les widgets Entry et les boutons, nous pouvons choisir les couleurs que nous voulons essayer. Les trois boutons ont la même fonction de commande de rappel de base (lambda : on_bgColor(x) où x est le numéro du bouton). Cela permet à n'importe lequel des trois boutons d'appeler la même fonction, avec un index différent, afin que le programme sache quel bouton a fait l'appel. Les boutons appellent la boîte de dialogue ColorSelect. Si vous connaissez la couleur que vous voulez, vous pouvez la saisir directement dans la zone d'entrée de Labelframe ou utiliser la boîte de dialogue. La boîte de dialogue vous permet également d'utiliser les curseurs ou de saisir directement dans la zone d'entrée. |
| |
Voici ce dont vous avez besoin pour utiliser la boîte de dialogue ColorSelect. | Voici ce dont vous avez besoin pour utiliser la boîte de dialogue ColorSelect. |
Next we look at the argument being passed in (which is the number of the button) and get the last color that was assigned to that background color group from the globals. This gives us the starting color for the Color Select dialog based on which of the three background colors we wish to work on. ** | Next we look at the argument being passed in (which is the number of the button) and get the last color that was assigned to that background color group from the globals. This gives us the starting color for the Color Select dialog based on which of the three background colors we wish to work on. ** |
| |
Les widgets TEntry possèdent chacun une variable texte qui permet au programme de retrouver simplement les données saisies. Il s'agit de TEntry1Data, TEntry2Data et TEntry3Data. J'ai lié les trois widgets TEntry à la même fonction de rappel dès qu'une touche est pressée sur le clavier et que le widget est en focus. Dans cette fonction, nous ne recherchons que la touche <Return>, puis nous lisons simplement la variable texte pour voir ce que l'utilisateur a saisi. | Les widgets TEntry possèdent chacun une variable texte qui permet au programme de retrouver simplement les données saisies. Il s'agit de TEntry1Data, TEntry2Data et TEntry3Data. J'ai lié les trois widgets TEntry à la même fonction de rappel dès qu'on appuie sur une touche du clavier et que le widget est en focus. Dans cette fonction, nous ne recherchons que la touche <Return>, puis nous lisons simplement la variable texte pour voir ce que l'utilisateur a saisi. |
| |
Examinons maintenant une partie du code qui est attaché aux boutons. Rappelez-vous que nous appelons le code on_bgColor(n) où n est la valeur que nous avons donnée au bouton. | Examinons maintenant une partie du code qui est attaché aux boutons. Rappelez-vous que nous appelons le code on_bgColor(n) où n est la valeur que nous avons donnée au bouton. |
| |
Pour l'essentiel, la première partie du code est générée par PAGE, montrant chacune des valeurs passées dans la fonction. J'ai ajouté l'instruction globale et la partie if debug : du code, afin de pouvoir masquer l'impression des valeurs lorsque j'en ai fini avec le débogage. | Pour l'essentiel, la première partie du code est générée par PAGE, montrant chacune des valeurs passées dans la fonction. J'ai ajouté l'instruction globale et la partie if debug: du code, afin de pouvoir masquer l'impression des valeurs lorsque j'en ai fini avec le débogage. |
| |
Ensuite, nous examinons l'argument transmis (qui est le numéro du bouton) et nous obtenons la dernière couleur qui a été attribuée à ce groupe de couleurs d'arrière-plan à partir des données globales. Cela nous donne la couleur de départ pour la boîte de dialogue de sélection des couleurs en fonction de la couleur d'arrière-plan sur laquelle nous souhaitons travailler. | Ensuite, nous examinons l'argument transmis (qui est le numéro du bouton) et nous obtenons la dernière couleur qui a été attribuée à ce groupe de couleurs d'arrière-plan à partir des données globales. Cela nous donne la couleur de départ pour la boîte de dialogue de sélection des couleurs en fonction de la couleur d'arrière-plan sur laquelle nous souhaitons travailler. |
We set the starting color, the title of the dialog, and the name of the parent Toplevel so the dialog gets centered properly. The response from the user comes back as the variable result.** | We set the starting color, the title of the dialog, and the name of the parent Toplevel so the dialog gets centered properly. The response from the user comes back as the variable result.** |
| |
Nous utilisons simplement une instruction if pour vérifier la valeur transmise. | Nous utilisons simplement une instruction if pour vérifier la valeur transmise : |
| |
which = args[0] | which = args[0] |
colr = lastbg3 | colr = lastbg3 |
| |
C'est assez simple, non ? Maintenant que nous avons les données de base, nous pouvons appeler la boîte de dialogue colorchooser. | C'est assez simple, non ? Maintenant que nous avons les données de base, nous pouvons appeler la boîte de dialogue colorchooser : |
| |
result = colorchooser.askcolor(colr, title=f "Enter Color for Background #{which}", parent=root) | result = colorchooser.askcolor( |
| |
| colr, title=f "Enter Color for Background #{which}", parent=root) |
| |
Nous définissons la couleur de départ, le titre de la boîte de dialogue, et le nom du parent Toplevel pour que la boîte de dialogue soit centrée correctement. La réponse de l'utilisateur revient sous la forme de la variable result. | Nous définissons la couleur de départ, le titre de la boîte de dialogue, et le nom du parent Toplevel pour que la boîte de dialogue soit centrée correctement. La réponse de l'utilisateur revient sous la forme de la variable result. |
Pour que les couleurs soient réellement appliquées aux widgets, nous devons appliquer les jeux de couleurs. | Pour que les couleurs soient réellement appliquées aux widgets, nous devons appliquer les jeux de couleurs. |
| |
En regardant l'image complète du formulaire, il y a un bouton appelé « Apply Colors ». Il possède un callback qui appelle simplement une fonction appelée set_colors(). Puisque j'ai conçu cette fonction à l'origine pour traiter les widgets ttk, nous devons commencer par appeler la fonction ttk.Style() pour obtenir une structure de style par défaut. | En regardant l'image complète du formulaire, il y a un bouton appelé « Apply Colors ». Il possède un callback qui appelle simplement une fonction appelée set_colors(). Puisque j'ai conçu cette fonction à l'origine pour traiter les widgets ttk, nous devons commencer par appeler la fonction ttk.Style() pour obtenir une structure de style par défaut : |
| |
def set_colors() : | def set_colors() : |
Many of the ttk widgets also need to be configured, sort of like the “standard” Tk widgets do, to set many of the various attributes available. To do this, we need to create a “generic” style for that widget, then apply it using the style attribute. (Gets somewhat confusing, huh?.** | Many of the ttk widgets also need to be configured, sort of like the “standard” Tk widgets do, to set many of the various attributes available. To do this, we need to create a “generic” style for that widget, then apply it using the style attribute. (Gets somewhat confusing, huh?.** |
| |
Chaque widget ttk possède un ensemble différent d'états qui peuvent être définis. Il peut s'agir d'états tels que « Active », « Disabled », « Background » et plus encore. Vous pouvez voir que nous avons défini les trois valeurs de couleur d'arrière-plan et d'avant-plan ci-dessus. Ce qui n'est pas évident dans la documentation sur la manipulation de ttk Style, c'est l'état inactif. Les états « Selected » et « Active » sont tous évidents, mais il y a l'état « !active », qui est l'état inactif (lorsque le widget est juste posé là sans que la souris ne fasse quoi que ce soit autour de lui). | Chaque widget ttk possède un ensemble différent d'états qui peuvent être définis. Il peut s'agir d'états tels que « Active », « Disabled », « Background » et plus encore. Vous pouvez voir que nous avons défini les trois valeurs de couleur d'arrière-plan et d'avant-plan ci-dessus. Ce qui n'est pas évident dans la documentation sur la manipulation de ttk Style, c'est l'état inactif. Les états « Selected » et « Active » sont évidents, mais il y a l'état « !active », qui est l'état inactif (lorsque le widget est juste posé là sans que la souris ne fasse quoi que ce soit autour de lui). |
| |
Comme je l'ai dit, chaque widget est différent quant aux états qu'il supporte. Par exemple, le TButton a un état « Active », un « Disabled » et un « Readonly », qui ont tous des attributs séparés qui peuvent être définis (en bas à gauche). | Comme je l'ai dit, chaque widget est différent quant aux états qu'il supporte. Par exemple, le TButton a un état « Active », un « Disabled » et un « Readonly », qui ont tous des attributs séparés qui peuvent être définis (en bas à gauche). |
Until next time, as always; stay safe, healthy, positive and creative!** | Until next time, as always; stay safe, healthy, positive and creative!** |
| |
Nous le faisons en utilisant la fonction style.configure, en commençant par notre style nommé avec le widget, puis en définissant les attributs comme nous le voulons, et enfin en appliquant le style via l'attribut style (en bas à droite). | Nous le faisons en utilisant la fonction style.configure, en commençant par notre style nommé avec le widget, puis en définissant les attributs comme nous les voulons, et enfin en appliquant le style via l'attribut style (en bas à droite). |
| |
Vous pouvez faire cela avec de nombreux attributs « normaux » que vous ne pouvez pas modifier dans PAGE, puisque n'importe quel widget ttk peut avoir n'importe quel style disponible. Imaginez avoir 100 widgets ttk, chacun avec son propre style. C'est possible ! | Vous pouvez faire cela avec de nombreux attributs « normaux » que vous ne pouvez pas modifier dans PAGE, puisque n'importe quel widget ttk peut avoir n'importe quel style disponible. Imaginez 100 widgets ttk, chacun avec son propre style. C'est possible ! |
| |
Assez de théorie pour ce mois-ci. Le mois prochain, nous verrons comment sauvegarder les jeux de couleurs dans quelque chose que nous pouvons utiliser et appliquer, et comment écrire cette information pour pouvoir l'utiliser dans d'autres programmes d'une manière très simple. | Assez de théorie pour ce mois-ci. Le mois prochain, nous verrons comment sauvegarder les jeux de couleurs dans quelque chose que nous pouvons utiliser et appliquer, et comment écrire cette information pour pouvoir l'utiliser dans d'autres programmes d'une manière très simple. |
| |
Jusqu'à la prochaine fois, comme toujours ; restez en sécurité, en bonne santé, positif et créatif ! | Jusqu'à la prochaine fois, comme toujours, restez en sécurité, en bonne santé, positif et créatif ! |
| |