Outils pour utilisateurs

Outils du site


issue162:python

Last month, a PAGE user came to both Don and myself for some help with a fairly new Python library that implements a spreadsheet like table widget written completely in Python. He was fairly new to PAGE and was having trouble getting the table to initialize properly. I thought the library has a tremendous amount of possibilities, so I thought I’d share the information with you. Just so you know, you don’t have to use PAGE to implement the sheet widget, but you do have to use Tkinter at least. To get started, you need to install the library and, as usual, we can use Pip to do it. $ pip install tksheet

Le mois dernier, un utilisateur de PAGE s'est adressé à Don et à moi pour être aidé sur une bibliothèque Python assez récente qui implémente un tableur comme un gadget tableau, écrit complètement en Python. Il était assez débutant sur PAGE et il avait du mal à initialiser la table correctement. J'ai pensé que la bibliothèque a une quantité énorme de possibilités ; j'ai donc pensé que je devrais partager ces informations avec vous. Simplement pour que vous le sachiez, vous n'avez pas besoin d'utiliser PAGE pour implémenter le gadget tableau, mais vous devez au moins utiliser Tkinter.

Pour commencer, vous devons installer la bibliothèque et, comme d'habitude, nous pouvons utiliser Pip pour ça.

$ pip install tksheet

Once you’ve done that, you might want to consider downloading the entire source code from the github repository at https://github.com/ragardner/tksheet. I suggest this since there are so many options that this library has, you might not catch some without digging into the source code. The documentation for the library is currently being written, so it’s easy to suss out how to do some of the options by having the code available. We’ll use a modified version of the demo program to start with, which does not require PAGE. You can find the full version on the homepage of the repository. from tksheet import Sheet import tkinter as tk

Une fois que vous l'avez fait, vous envisagerez peut-être de télécharger tout le code source depuis le dépôt github à https://github.com/ragardner/tksheet. Je vous suggère cela car cette bibliothèque a tant de possibilités que vous pourriez ne pas en voir certaines sans fouiller dans le code source. La documentation sur cette bibliothèque est en cours de rédaction ; aussi, il est facile de découvrir comment utiliser certaines options en ayant le code à disposition.

Au début, nous utiliserons une version modifiée du programme de démonstration, qui ne nécessite pas PAGE. Vous en trouvez la version complète sur la page d'accueil du dépôt.

from tksheet import Sheet

import tkinter as tk

As almost always, we want to import the important libraries, in this case, the tksheet and tkinter libraries. Now (top right) we’ll create a class called demo. This will hold all of the code for the demo program that deals with the sheet widget. As you go through the code, you will see that many of the functions later on are simply there to allow you to customize the builtin functions that the library has. As you already know, the init function sets up various parameters and defaults. In the next lines, the sheet object is simply an instance of Sheet (above). Here (below) is where you load the dummy data into the sheet.

Comme presque toujours, nous voulons importer les bibliothèques primordiales, dans notre cas, les bibliothèques tksheet et tkinter.

Maintenant (en haut à droite), nous créerons une classe appelée demo. Elle contiendra tout le code du programme de démo qui a un rapport avec le gadget feuille de calcul. Quand vous parcourrez le code, vous verrez que beaucoup des fonctions qui suivent sont simplement là pour vous permettre de personnaliser les fonctions intégrées dans la bibliothèque.

Comme vous le savez déjà, la fonction init fixe de nombreux paramètres et valeurs par défaut. Dans les lignes suivantes, l'objet sheet est simplement une instance de Sheet (ci-dessus).

Voici (ci-dessous) où vous chargez les données fictives dans le tableur.

Next (next page. top right), we enable the various bindings that are already coded in the library. The next two lines insert the frame and sheet objects into a Tkinter grid. self.frame.grid(row=0, column=0, sticky=“nswe”) self.sheet.grid(row=0, column=0, sticky=“nswe”) As you can tell from the commented code (bottom right), the next set of lines show ways to control various things like the theme, highlighting columns, rows and cells, etc.

Ensuite, (page suivante, en haut à droite), nous activons les divers liens qui sont déjà codés dans la bibliothèque.

Les deux lignes suivantes insèrent les objets frame et sheet dans la grille Tkinter.

self.frame.grid(row=0, column=0, sticky=“nswe”) self.sheet.grid(row=0, column=0, sticky=“nswe”)

Comme vous pouvez le lire dans les lignes commentées (en bas à droite), le jeu suivant de lignes montre les manières de contrôler diverses choses comme le thème, les colonnes surlignées, les lignes et les cellules, etc.

The rest of the code (next page, right side) overrides the default events and bindings, and provides examples of how to handle them in your own code. Finally, the required instantiation of the demo class object and the call to the Tkinter mainloop. app = demo() app.mainloop() When you fire up the program, you should see something that looks like the image on the next page (top right). While that wasn’t too hard at all, I believe that using PAGE makes the process much easier. I’ve created a VERY simple PAGE GUI to show how quickly and easy it is.

Le reste du code (page suivante, côté droit) écrase les évènements et les liens par défaut et fournit des exemples de comment les manipuler dans votre propre code.

Enfin, il y a l'instanciation nécessaire de l'objet de la classe demo et l'appel à la boucle principale de Tkinter.

app = demo()

app.mainloop()

Quand vous lancez le programme, vous devez voir quelque chose qui ressemble à l'image de la page suivante (en haut à droite).

Bien que ça ne soit pas difficile du tout, je crois que l'utilisation de PAGE facilite beaucoup plus le traitement. J'ai créé une interface utilisateur TRÈS simple avec PAGE pour montrer comme c'est rapide et facile.

Create a folder to hold your project and start up PAGE within that folder. Expand the default Top level form just a bit and place two buttons near the very top of the form, one on the left and one on the right. The left one should have the text “Load CSV”, and the one on the right “Exit”. In the command attribute for the left button enter “on_btnLoad” and for the right button “on_btnExit”. (We’ve covered PAGE programming so often, this should be very obvious, but if it isn’t, look at one of my previous articles about using PAGE. My article in FCM#155 should be a good easy reference). Next, place a frame in the form that takes up pretty much of the rest of the form. Then place a custom widget into that frame and expand it to fill the frame. (Mouse-3 (Right-click for most people)) | Widget | Fill Container). Save your project as tksheetGUI.tcl and generate your python code.

Créez un dossier pour contenir votre projet et démarrez PAGE dans ce dossier. Agrandissez un petit peu le formulaire par défaut de niveau le plus haut et placez deux boutons presque en haut du formulaire, un à gauche et l'autre à droite. Celui de gauche aura le texte « Load CSV » (Charger un CSV) et celui de droite « Exit » (Sortie). Dans l'attribut de commande du bouton gauche entrez « on_btnLoad » et pour le bouton de droite « on_btnExit ». (Nous avons parlé si souvent de la programmation avec PAGE que ça devrait être évident ; si ça ne l'est pas, regardez un de mes articles précédents sur PAGE. L'article dans le FCM n° 155 devrait être une bonne et facile référence.)

Ensuite, placez un cadre dans le formulaire pour qu'il occupe la majeure partie de ce qui reste. Puis placez un gadget personnalisé dans le cadre et agrandissez-le pour remplir le cadre. (Souris-3 (en général, le clic droit) | Widget | Fill Container). Sauvegardez votre projet sous le nom tksheetGUI.tcl et générez votre code Python.

Bottom right is what your project hopefully looks like. If not, that’s ok. You get the general idea. Now open tksheet_support.py in your IDE or editor, and let’s get to work. PAGE only creates a single import line, since that’s all that you need to get started. Add the following lines to the import section of the code to support our needs. The line that PAGE gives us is not in bold. import sys import platform import os # Third party libraries from tksheet import Sheet import pandas as pd

En bas à droite, voici ce à quoi, j'espère, votre projet ressemble. Si ce n'est pas le cas, c'est bon quand même. Vous avez l'idée générale.

Maintenant, ouvrez tksheet_support.py dans votre IDE ou votre éditeur, et au travail.

PAGE ne crée qu'une unique ligne d'import car c'est tout ce dont vous avez besoin pour commencer. Ajoutez les lignes suivantes à la section import du code pour supporter vos besoins. La ligne que PAGE nous fournit n'est pas en gras.

import sys import platform import os

# Third party libraries - Bibliothèques tierces from tksheet import Sheet import pandas as pd

We also need to modify the import section that PAGE provides for us. Normally, you would not need to do this, but we are going to add support for the Tkinter messagebox and the filedialog sub-systems. import Tkinter as tk import tkFileDialog as filedialog import tkMessageBox as messagebox except ImportError: import tkinter as tk from tkinter import messagebox from tkinter import filedialog

Nous devons aussi modifier la section import que PAGE nous fournit. Normalement, vous ne devriez pas avoir besoin de le faire, mais nous allons ajouter du support à la « messagebox » (champ de message) de Tkinter et aux sous-systèmes filedialog.

import Tkinter as tk

import tkFileDialog as filedialog

import tkMessageBox as messagebox

except ImportError:

import tkinter as tk

from tkinter import messagebox

from tkinter import filedialog

Note that we actually don’t do anything with the messagebox but it’s there for your possible future development. Now (top right) we need to add a couple of lines to the init function, that again, PAGE provides for us. As I’m sure you are aware, this (middle right) will call the startup() and init_custom() functions before the form is shown to the user. Let’s look at the startup function first. Yes, there is some code that isn't strictly needed, but I like to add it. Basically, we get and provide the python version, program path and program version, and print all of that to the terminal window. Then we set up some global default values for use with the tksheet library.

Notez que nous ne faisons vraiment rien avec messagebox, mais elle est là pour de possibles développements futurs.

Maintenant (en haut à droite), nous devons ajouter quelques lignes pour la fonction init, que PAGE, là encore, nous fournit.

Comme vous le savez, j'en suis sûr, ceci (au milieu à droite) appellera les fonctions startup() et init_custom() avant que le formulaire soit montré à l'utilisateur. Regardons d'abord la fonction startup.

Oui, il y a du code qui n'est pas strictement nécessaire, mais j'aime l'ajouter. En gros, nous obtenons et fournissons la version de Python, le chemin du programme et sa version, et nous imprimons tout ça dans la fenêtre du terminal. Ensuite, nous paramétrons les valeurs globales par défaut pour les utiliser avec la bilbiothèque tksheet.

In the init_custom() function, we will be initializing various settings of the tksheet for our use. It took me a fair amount of time to narrow down the actual settings needed for proper demo use. There are many other settings as you saw in the earlier demo program, but, for us, these are needed. One thing to note is the theme setting (see below). There are four default themes defined by default. The first demo used the light green theme. For the PAGE version, we will use the dark blue theme. Now (top right) we need to enable the bindings that we want so that the functionality is what you would normally expect for a spreadsheet demo. These are things like selecting a single cell, a row or column and using the arrow keys as well as allowing for “right-click” (mouse 3) context menu support. The next few lines (bottom right) allow you to use the popup context menu. Some of them are pretty obvious, but it’s not as clear why the last 6 lines would be needed.

Dans la fonction init_custom(), nous initialiserons divers paramètres de tksheet pour notre usage. Ça m'a pris un bon moment pour me limiter aux paramètres vraiment nécessaires pour une utilisation correcte de la démo. Il y a de nombreux autres paramètres comme vous l'avez vu dans le programme de démo précédent, mais, pour nous, ceux-là sont nécessaires. Une chose à noter, c'est le paramètre du thème (voir ci-dessous). Il y a quatre thèmes définis par défaut. La première démo utilise le thème vert clair. Pour la version avec PAGE, nous utiliserons le thème bleu foncé.

Maintenant (en haut à droite), nous devons activer les liens que nous voulons pour que la fonctionnalité soit ce que nous en attendons d'une démo de tableur. Il y a des choses comme la sélection d'une seule cellule, d'une ligne ou d'une colonne et l'utilisation des touches fléchées tout comme d'autoriser le support du menu contextuel pour le clic droit (souris 3).

Les quelques lignes suivantes (en bas à droite) vous permettent d'utiliser le menu contextuel sous forme d'info-bulle. Certaines d'entre elles sont bien évidentes, mais la nécessité des six dernières lignes n'est pas aussi claire.

The last part of the init_custom function (bottom right) deals with binding the Mouse-3 button to the “rc” routine and sets extra bindings for us to be able to override the default functions within the library. Now (next page, top right) we’ll create the four callback functions that we just defined. I must admit that I created the first three for a different demo that printed the information to a status label, but I felt that, for this very simple demo, printing to the terminal was ok. I created a simple class to handle the actual tksheet as a custom control. See next page, bottom right.

La dernière partie de la fonction init_custom (en bas à droite) a trait aux liens du bouton Souris-3 avec la routine « rc » et paramètre des liens supplémentaires pour que nous soyons capables de remplacer les fonctions par défaut de la bibliothèque.

Maintenant (page suivante, en haut à droite), nous créons les quatre fonctions de rappel que nous venons de définir. Je dois admettre que j'ai créé les trois premières pour une démo différente qui imprimait les informations sur une étiquette d'état, mais j'ai senti que, pour cette très simple démo, l'impression sur un terminal était correcte.

Almost at the end now. We still have to assign the library as the custom control. PAGE supplies a line that says “Custom = tk.Frame”, but we need to replace tk.Frame with our external tkinter control library. You can add the following line and comment out the ‘Custom = tk.Frame’ line. Custom = sheet Finally, we need to provide the callback and support functions for the buttons that we defined when we designed the GUI (next page, top right). PAGE generated the first two functions for us as skeletons. The final function helps the import of the CSV files. You already have seen the proper way to end a PAGE application, but I’ve included it here for your convenience.

Nous arrivons presque à la fin. Nous devons encore assigner la bibliothèque comme étant le contrôle personnalisé. PAGE fournit une ligne qui dit « Custom = tk.Frame », mais nous devons remplacer tk.Frame par notre bibliothèque de contrôle de tkinter externe. Vous pouvez ajouter la ligne suivante et commenter la ligne « Custom = tk.Frame ».

Custom = sheet

Enfin, nous devons fournir les fonctions de rappel et de support des boutons que nous avons définies quand nous avons conçu l'interface utilisateur (page suivante, en haut à droite). PAGE génère les squelettes des deux premières fonctions pour nous. La dernière fonction aide à l'importation des fichiers CVS. Vous avez déjà vu la manière correcte de terminer une application PAGE, mais je l'ai incluse ici, à votre disposition.

Now (next page, middle) we have the callback for the load csv file button. It’s a little bloated, but I thought it would be easier for you to follow the code this way rather than write it more elegantly. Last but not least, here (bottom right) is the load_csv_file function. Here we are using pandas to read the CSV file and convert it into a list. That way, the tksheet library can utilize it. Be sure to save your file. Last but not least (again!), you need to know where a good CSV file is. For this demo, I have used the titanic3.csv file which is provided with the source code for the Pandastable Library. I’m certain it’s been released into the public domain. I copied it and put it into the development folder for quick access.

Maintenant (page suivante, au milieu), nous avons le rappel pour le bouton de chargement du fichier CSV. C'est un peu exagéré, mais j'ai pensé qu'il vous serait plus facile de suivre le code de cette façon plutôt qu'en l'écrivant de manière plus élégante.

Dernier point, mais non des moindres (encore !), nous avons besoin de savoir où trouver un bon fichier CSV. Pour cette démo, j'ai utilisé le fichier titanic3.csv qui est fourni avec le code source pour la bibliothèque Pandastable. Je suis certain qu'il est du domaine public. Je l'ai copié et je l'ai mis dans le dossier de développement pour un accès rapide.

Once you run the program, it should look something like this: I hope that you enjoyed this month’s project as much as I did creating it. This library has a lot of potential and will be great for quick display of things in table or sheet format. However, there is no code to write back to a file (that’s simple enough for you to work out) and there are no calculation functions at this point. But this is a fantastic library and something that has been needed for a very long time! As I did once before, I’ve created a repository on github to hold the code and images from this article. You can find it at https://github.com/gregwa1953/FCM162 . As always, until next time; stay safe, healthy, positive and creative!

Quand vous lancez le programme, vous devriez voir quelque chose comme ceci :

J'espère que vous avez aimé le projet de ce mois autant que moi en le créant. La bibliothèque a beaucoup de possibilités et sera très bien pour l'affichage rapide de choses sous forme de table ou de feuille de calcul. Cependant, il n'y a pas de code pour réécrire dans un fichier (c'est suffisament simple pour que vous le réalisiez par vous-même) et il n'y a aucune fonction de calcul pour le moment. Mais c'est une bibliothèque fantastique et on en avait besoin depuis longtemps !

Comme je l'ai fait une fois précédemment, j'ai créé un dépôt sur github pour conserver le code et les images de cet article. Vous pouvez le trouver à https://github.com/gregwa1953/FCM162 .

Comme toujours, à la prochaine fois ; soyez prudent, restez en bonne santé, positif et créatif !

issue162/python.txt · Dernière modification : 2020/11/07 14:43 de andre_domenech