Outils pour utilisateurs

Outils du site


issue185:python

Sorry for missing last month. Between moving and my health problems, I had to put many things on hold for a while and this, unfortunately, ended up being one of them. I promised that we would continue with the Styles and Themes series of articles, so that’s what we’ll do. The information for each colorset is held in a dictionary. It looks something like that shown top right. You can see that there is a key that holds the name of the colorset and then another dictionary that holds a background/foreground designation and a hex value of the color. The back/fore color name is the key and the hex value of the color itself is the value of the dictionary entries. We simply add new colorsets to a global one to keep everything in sync. newset = { response: { “BG1”: lastbg1, “BG2”: lastbg2, “BG3”: lastbg3, “FG1”: lastfg1, “FG2”: lastfg2, “FG3”: lastfg3, } } ColorSets.update(newset)

Désolé pour mon absence du mois dernier. Entre un déménagement et mes problèmes de santé, j'ai dû mettre beaucoup de choses en attente pendant un certain temps et celle-ci, malheureusement, a fini par être l'une d'elles.

J'ai promis que nous continuerions la série d'articles sur les styles et les thèmes, c'est donc ce que nous allons faire.

Les informations relatives à chaque jeu de couleurs sont contenues dans un dictionnaire. Il ressemble à celui illustré en haut à droite.

Vous pouvez voir qu'il y a une clé qui contient le nom du jeu de couleurs, puis un autre dictionnaire qui contient une désignation d'arrière-plan/avant-plan et une valeur hexadécimale de la couleur. Le nom de la couleur d'arrière-plan/avant-plan est la clé et la valeur hexadécimale de la couleur elle-même est la valeur des entrées du dictionnaire.

Il suffit d'ajouter de nouveaux jeux de couleurs à un jeu global pour que tout reste synchronisé.

  newset = {
      response: {
          "BG1": lastbg1,
          "BG2": lastbg2,
          "BG3": lastbg3,
          "FG1": lastfg1,
          "FG2": lastfg2,
          "FG3": lastfg3,
      }
  }
  ColorSets.update(newset)

As you can see, we use the dictionary.update method to add the new one. But how do we save the “master” colorset to a file for retrieval later on? We use the pickle library. However, we have to be careful if we are going to be sharing this file with others, since by default newer versions of Python greater than 3.7 use a higher compression algorithm. Python 3.7 uses a level 4 compression. So to support all Python versions from 3.7 forward, we have to state that the level must be “pickle.DEFAULT_PROTOCOL (shown right). The program also has a utility that will display the dictionaries in a “viewer” form (shown right). Because it is a dictionary, the output with all the curly braces won’t look very pretty when displayed in text. To make this a bit nicer looking, we can use the pretty print library. Once we have formatted the data the way we want it, we can simply use the tk.text.insert method to place the data into the widget for display. The program also provides a way to create a separate file that can be imported into a program that you wrote that will allow you to use a single colorset or multiple colorsets with your own widget list. There is a form to do that from the button menu. When the “Write File” button is clicked, we create the export file. The first thing we do is to create the import section of the file. import tkinter as tk import tkinter.ttk as ttk from tkinter.constants import * Next, we write out the dictionaries for the colorset with the various sets that were selected.

Comme vous pouvez le voir, nous utilisons la méthode dictionary.update pour ajouter le nouveau jeu de couleurs. Mais comment sauvegarder le jeu de couleurs « maître » dans un fichier pour le retrouver plus tard ? Nous utilisons la bibliothèque pickle. Cependant, nous devons faire attention si nous voulons partager ce fichier avec d'autres personnes, car, par défaut, les nouvelles versions de Python supérieures à 3.7 utilisent un algorithme de compression plus élevé. Python 3.7 utilise une compression de niveau 4. Ainsi, pour prendre en charge toutes les versions de Python à partir de la 3.7, nous devons indiquer que le niveau doit être « pickle.DEFAULT_PROTOCOL » (à droite).

Le programme dispose également d'un utilitaire qui affiche les dictionnaires sous la forme d'une « visionneuse » ( à droite).

Comme il s'agit d'un dictionnaire, la sortie avec toutes les accolades ne sera pas très jolie lorsqu'elle sera affichée en texte. Pour rendre le résultat un peu plus joli, nous pouvons utiliser la bibliothèque pretty print. Une fois que nous avons formaté les données comme nous le souhaitons, nous pouvons simplement utiliser la méthode tk.text.insert pour placer les données dans le widget afin de les afficher.

Le programme permet également de créer un fichier séparé qui peut être importé dans un programme que vous avez écrit et qui vous permettra d'utiliser un seul jeu de couleurs ou plusieurs jeux de couleurs avec votre propre liste de widgets. Il existe un formulaire pour le faire à partir du menu des boutons. Lorsque le bouton « Write File » (Écrire le fichier) est cliqué, nous créons le fichier d'exportation.

La première chose que nous faisons est de créer la section d'importation du fichier.

import tkinter as tk

import tkinter.ttk as ttk

from tkinter.constants import *

Ensuite, nous écrivons les dictionnaires pour le jeu de couleurs avec les différents jeux qui ont été sélectionnés.

newset={“Greg1”: {“BG1”: “gray54”, “BG2”: “gray86”, “BG3”: “gray64”, “FG1”: “white”, “FG2”: “black”, “FG3”: “black”}, “Vintage1”: {“BG1”: “#8E3200”, “BG2”: “#D7A86E”, “BG3”: “#A64B2A”, “FG1”: “white”, “FG2”: “black”, “FG3”: “black”}, “Vintage2”: {“BG1”: “#362706”, “BG2”: “#464E2E”, “BG3”: “#ACB992”, “FG1”: “white”, “FG2”: “white”, “FG3”: “black”}} Now, we create the function that will apply the colorsets that will be used to all the widgets that happen to be on your form. The first thing we have to do in the function is to apply a ttk style (shown below). In this case, we will be using the “default” style. However, this can be changed to whatever style your system will support. Then we create a number of lists that use the widget classes for all the possible widgets. There is a list for widgets that don’t support the active background property, one that has the widgets that won’t support the foreground property (which is just a Frame, but there could be more in the future) then we create a list of all the ttk widgets and finally a list of all the widgets that can be containers. In order to support the TNotebook and the TButton, we have to supply a map that will allow the various background colors and foreground colors (shown top right).

newset={“Greg1”: {“BG1”: “gray54”, “BG2”: “gray86”, “BG3”: “gray64”, “FG1”: “white”, “FG2”: “black”, “FG3”: “black”}, “Vintage1”: {“BG1”: “#8E3200”, “BG2”: “#D7A86E”, “BG3”: “#A64B2A”, “FG1”: “white”, “FG2”: “black”, “FG3”: “black”}, “Vintage2”: {“BG1”: “#362706”, “BG2”: “#464E2E”, “BG3”: “#ACB992”, “FG1”: “white”, “FG2”: “white”, “FG3”: “black”}}

Maintenant, nous créons la fonction qui appliquera les jeux de couleurs qui seront utilisés à tous les widgets qui se trouvent sur votre formulaire.

La première chose que nous devons faire dans la fonction est d'appliquer un style ttk (montré ci-dessous). Dans notre cas, nous utiliserons le style « par défaut ». Cependant, vous pouvez le changer pour n'importe quel style supporté par votre système. Ensuite, nous créons un certain nombre de listes qui utilisent les classes de widgets pour tous les widgets possibles. Il y a une liste pour les widgets qui ne supportent pas la propriété active background, une autre qui contient les widgets qui ne supportent pas la propriété foreground (qui n'est qu'un cadre, mais il pourrait y en avoir d'autres à l'avenir), puis nous créons une liste de tous les widgets ttk et enfin une liste de tous les widgets qui peuvent être des conteneurs.

Afin de supporter TNotebook et TButton, nous devons fournir une carte qui permettra différentes couleurs d'arrière-plan et d'avant-plan (montré en haut à droite).

At this point, we can get a list of all children of the Toplevel form. Once we have the list, we try to set all the background and foreground colors for those widgets (shown bottom right). While we are working with this widget, we’ll check for any children and try to apply the background and foreground colors of them (shown next page, top right). We then check for specific widgets that need to have special handling, like the TFrame, Treeview, TScrollbars and the TLabel widgets (shown next page, middle right). Finally, we can do any “standard” tk widgets. Again, we have to check if the widget supports the foreground and active background properties (shown next page, bottom right). Last but not least, we do an update on the Toplevel form so that all the changes will show up. Toplevel.update()

À ce stade, nous pouvons obtenir une liste de tous les enfants du formulaire Toplevel. Une fois que nous avons la liste, nous essayons de définir toutes les couleurs d'arrière-plan et d'avant-plan pour ces widgets (en bas à droite).

Pendant que nous travaillons avec ce widget, nous vérifions s'il y a des enfants et nous essayons d'appliquer les couleurs d'arrière-plan et d'avant-plan de ces derniers (voir page suivante, en haut à droite).

Nous vérifions ensuite les widgets spécifiques qui doivent faire l'objet d'une gestion particulière, comme les widgets TFrame, Treeview, TScrollbars et TLabel (voir page suivante, au milieu à droite).

Enfin, nous pouvons nous occuper de tous les widgets tk « standard ». Encore une fois, nous devons vérifier si le widget supporte les propriétés foreground et active background (voir page suivante, en bas à droite).

Dernier point important, nous faisons une mise à jour du formulaire Toplevel pour que tous les changements soient visibles.

Toplevel.update()

This form may be imported into your project. It is named ColorSetImport.py. Now in your own project, you should import it like this. from ColorSetImport import newset, do_tk_widgets If your project will be supporting more than one colorset in the newset dictionary, you will need to determine which colorset to use then assign it to a global colorset. The next line assumes that you will use the first colorset in the dictionary. colorset=newset[0] Finally, to apply the colorset, simply call the do_tk_widgets function. do_tk_widgets(_top1, colorset) Where the first parameter is the form name and passing the selected colorset in as the second parameter. There is a demo program that shows how this works (shown left). I’ve put all the source code on my github repository at https://github.com/gregwa1953/FCM-185 Until next time, as always; stay safe, healthy, positive and creative!

Ce formulaire peut être importé dans votre projet. Il est nommé ColorSetImport.py. Dans votre propre projet, vous devez l'importer comme ceci :

from ColorSetImport import newset, do_tk_widgets

Si votre projet prend en charge plus d'un jeu de couleurs dans le dictionnaire newset, vous devrez déterminer le jeu de couleurs à utiliser et l'affecter à un jeu de couleurs global. La ligne suivante suppose que vous utiliserez le premier jeu de couleurs du dictionnaire.

colorset=newset[0]

Enfin, pour appliquer le jeu de couleurs, il suffit d'appeler la fonction do_tk_widgets :

  do_tk_widgets(_top1, colorset)

où le premier paramètre est le nom du formulaire et le deuxième le jeu de couleurs sélectionné.

Il y a un programme de démonstration qui montre comment cela fonctionne (à gauche).

J'ai mis tout le code source sur mon dépôt github à https://github.com/gregwa1953/FCM-185.

Jusqu'à la prochaine fois, comme toujours, restez en sécurité, en bonne santé, positif et créatif !

Texte en noir dans l'encadré de la page 24

To load the colorset into the program at startup, we read the pickle file and assign the colorset to the global master.

Pour charger au démarrage le jeu de couleurs dans le programme, nous lisons le fichier pickle et assignons le jeu de couleurs au maître global.

Texte en noir dans l'encadré de la page 25

Next, we set the background for the Toplevel widget

Ensuite, nous réglons l'arrière-plan du widget Toplevel

Texte en noir dans l'encadré de la page 26

Now we can set “global” background and foreground colors by using the “.” widget class.

Maintenant, nous réglons les couleurs « globales » d'avant et d'arrière-plans en utilisant la classe de widget « . ».

issue185/python.txt · Dernière modification : 2022/10/04 17:33 de andre_domenech