Application Python avec interface graphique tkinter - exportation facile sur un autre PC -Tutoriel

Joséphine Picot
7 min readMar 29, 2021

L’application que nous allons coder va :

I. Demander à l’utilisateur de sélectionner un fichier Excel

II. Récupérer les données du fichier dans un dataframe et modifier ce dataframe -comme bon vous semble

III. Générer un nouveau fichier Excel avec les données modifiées du dataframe

Démonstration de l’application que nous allons coder :

Pour coder, j’utilise le logiciel Visual Studio Code sur Windows 10 avec la version Python 3.8. La bibliothèque que nous utiliserons pour coder l’interface graphique de notre application s’appelle tkinter et nécessite une version de Python 3 ou supérieure. (pour une version Python 2 la bibliothèque tkinter s’utilise différemment)

I. Développement de l’application

  • Installations et importations
  • Fonction popupmsg
  • Fonction traitement
  • Fenêtre principale
  • Code complet

II. Conversion en fichier exécutable & exportation

  • Conversion en fichier exécutable
  • Exportation du travail

I. Développement de l’application

Installations

Nous aurons besoin de la bibliothèque pandas pour lire et traiter le fichier Excel, ainsi que la bibliothèque os pour obtenir le chemin d’accès au dossier contenant le fichier Excel sélectionné par l’utilisateur.

pip install pandas
pip install os

Importations

import tkinter as tk
from tkinter import ttk
from tkinter.filedialog import askopenfilename
import tkinter.font as font
import pandas as pd
import os

Fonction pop-up

Nous allons d’abord coder une fonction qui, lorsqu’elle sera appelée, fera apparaître un message (que l’on choisira) style message d’erreur ou avertissement, exemple ci-dessous :

On appellera la fonction en saisissant directement le message que l’on souhaite en argument. Je l’appelle popupmsg car un message va ‘poper’ :

def popupmsg(msg):
popup = tk.Tk()
# On définit le titre de la fenêtre popup.wm_title("Votre attention s'il vous plait !") # On choisit une couleur de fond à notre fenêtre. popup.configure(background="#FA7F7F") # Puis on définit le message que l'on verra apparaître label_popup = tk.Label(popup, text=msg, foreground = "#641E16", background = "#FA7F7F") # On définira plus tard une mise en forme standard f_label label_popup['font'] = f_label # On ajoute notre texte à la fenêtre avec .pack() label_popup.pack() # On ajoute un bouton qui fermera notre fenêtre bouton_popup = tk.Button(popup, text="C'est compris!", command = popup.destroy) # On embellit notre bouton bouton_popup.configure(foreground="#641E16", background = "white")
bouton_popup['font'] = f_bouton
bouton_popup.pack()
popup.mainloop()

Fonction traitement

Ensuite nous allons coder ce qui va permettre de traiter nos donnée. Dans cet exemple, je vais simplement :

  • Demander à l’utilisateur de sélectionner un fichier Excel (ou CSV) dont le chemin d’accès sera enregistré dans la variable name
  • Lire le fichier Excel en format dataframe dans la variable df
  • Générer un nouveau fichier Excel (ou CSV) dans le même dossier, sous le nom de données_modifiées.xlsx.

C’est dans cette fonction que vous aller pouvoir placer votre code pour traiter le dataframe df.

def traitement():    # On demande à l'utilisateur de sélectionner un fichier avec la commande askopenfilename, en lui laissant le choix entre Excel et CSV.    chemin_fichier = askopenfilename(filetypes=[('Excel', ('*.xls', '*.xlsx')), ('CSV', '*.csv')])    # On lit le fichier dans la variable df    if chemin_fichier.endswith('.csv'):
df = pd.read_csv(chemin_fichier)
else:
df = pd.read_excel(chemin_fichier, engine='openpyxl')
################### VOTRE CODE #################### # On récupère le chemin d'accès du dossier pour pouvoir générer un fichier Excel dans ce même dossier. chemin_dossier = os.path.dirname(chemin_fichier) # On vérifie qu'il n'existe pas déjà un fichier excel 'données_modifiées' dans le dossier, auquel cas on fera poper un message d'erreur en appelant popupmsg. if "données_modifiées.xlsx" in os.listdir(chemin_dossier):
popupmsg("Il y a déjà un fichier nommé 'données_modifiées.xlsx' dans le dossier, veuillez renommer ce fichier pour que le programme puisse en générer un nouveau.")
else :
# On génère le fichier "données_modifiées.xlsx" df.to_excel(str(chemin_dossier) + "\\" + "données_modifiées.xlsx", index=False)
popupmsg("Votre fichier excel est généré =) Vous pouvez le trouver dans le même dossier que le fichier excel initial." + "\n" + "\n" + "A bientôt!" + "\n")

Fenêtre principale

L’interface principale va ressembler à cela :

Le bouton “Cliquez ici pour charger un fichier” va appeler la fonction traitement que nous avons codé juste avant.

Le bouton “J’ai fini merci!” va simplement fermer la fenêtre.

Tout le code autour ne sert qu’à faire joli. Par exemple les variables f_label & f_bouton contiennent les paramètres de police et de taille que nous allons appliquer à nos labels (textes) et à nos boutons.

interface = tk.Tk()
interface.title("Programme de modification de fichier Excel")
interface.configure(background="#2B00FA")
# 1er message f_label = font.Font(family='Times New Roman', size=20)
f_bouton = font.Font(family='Times New Roman', size=15, weight="bold")
label = tk.Label(text="\n" + "Bonjour! Vous avez lancé le programme d'aide à la modification de fichier Excel." + "\n" + "\n" + "Veuillez sélectionner un fichier Excel ou CSV :" + "\n" , foreground = "white", background = "#2B00FA")label['font'] = f_label
label.pack()
# 1er boutonbouton = tk.Button(text='Cliquez ici pour charger un fichier', command=traitement)
bouton.place(relx=0.200, rely=0.06, height=500, width=147)
bouton.configure(foreground="#2B00FA")
bouton['font'] = f_bouton
bouton.pack(expand="yes")
# 2eme messagelabel2 = tk.Label(text="\n" + "Une fois le fichier séléctionné, le programme va générer un nouveau fichier excel (nommé 'Données_modifiées.xlsx') dans le même dossier que le fichier séléctionné." + "\n" + "\n" + "Pour relancer le programme, veuillez renommer le fichier 'Données_modifiées.xlsx' pour ne pas rentrer en conflit avec le programme." + "\n", foreground = "white", background = "#2B00FA")
label2['font'] = f_label
label2.pack()
# 2eme boutonbouton2 = tk.Button(interface, text="J'ai fini merci!", command = interface.destroy)
bouton2.configure(foreground="#2B00FA")
bouton2['font'] = f_bouton
bouton2.pack()
# On fait s'exécuter tout ça en boucle (en gros) avec la fonction mainloopinterface.mainloop()

Le code complet -sans blabla

import tkinter as tk
from tkinter import ttk
from tkinter.filedialog import askopenfilename
import tkinter.font as font
import pandas as pd
import os
def popupmsg(msg):
popup = tk.Tk()
popup.wm_title("Votre attention s'il vous plait !")
popup.configure(background="#FA7F7F")
label_popup = tk.Label(popup, text=msg, foreground = "#641E16", background = "#FA7F7F")
label_popup['font'] = f_label
label_popup.pack()
bouton_popup = tk.Button(popup, text="C'est compris!", command = popup.destroy)
bouton_popup.configure(foreground="#641E16", background = "white")
bouton_popup['font'] = f_bouton
bouton_popup.pack()
popup.mainloop()
def traitement():
chemin_fichier = askopenfilename(filetypes=[('Excel', ('*.xls', '*.xlsx')), ('CSV', '*.csv')])
if chemin_fichier.endswith('.csv'):
df = pd.read_csv(chemin_fichier)
else:
df = pd.read_excel(chemin_fichier, engine='openpyxl')
#################### VOTRE CODE ##################### chemin_dossier = os.path.dirname(chemin_fichier)
if "données_modifiées.xlsx" in os.listdir(chemin_dossier):
popupmsg("Il y a déjà un fichier nommé 'données_modifiées.xlsx' dans le dossier, veuillez renommer ce fichier pour que le programme puisse en générer un nouveau.")
else :
df.to_excel(str(chemin_dossier) + "\\" + "données_modifiées.xlsx", index=False)
popupmsg("Votre fichier excel est généré =) Vous pouvez le trouver dans le même dossier que le fichier excel initial." + "\n" + "\n" + "A bientôt!" + "\n")
interface = tk.Tk()
interface.title("Programme de modification de fichier Excel")
interface.configure(background="#2B00FA")
# 1er messagef_label = font.Font(family='Times New Roman', size=20)
f_bouton = font.Font(family='Times New Roman', size=15, weight="bold")
label = tk.Label(text="\n" + "Bonjour! Vous avez lancé le programme d'aide à la modification de fichier Excel." + "\n" + "\n" + "Veuillez sélectionner un fichier Excel ou CSV :" + "\n" , foreground = "white", background = "#2B00FA")label['font'] = f_label
label.pack()
# 1er boutonbouton = tk.Button(text='Cliquez ici pour charger un fichier', command=traitement)
bouton.place(relx=0.200, rely=0.06, height=500, width=147)
bouton.configure(foreground="#2B00FA")
bouton['font'] = f_bouton
bouton.pack(expand="yes")
# 2eme messagelabel2 = tk.Label(text="\n" + "Une fois le fichier séléctionné, le programme va générer un nouveau fichier excel (nommé 'Données_modifiées.xlsx') dans le même dossier que le fichier séléctionné." + "\n" + "\n" + "Pour relancer le programme, veuillez renommer le fichier 'Données_modifiées.xlsx' pour ne pas rentrer en conflit avec le programme." + "\n", foreground = "white", background = "#2B00FA")
label2['font'] = f_label
label2.pack()
# 2eme boutonbouton2 = tk.Button(interface, text="J'ai fini merci!", command = interface.destroy)
bouton2.configure(foreground="#2B00FA")
bouton2['font'] = f_bouton
bouton2.pack()
interface.mainloop()

II. Conversion en fichier exécutable & exportation

Conversion en fichier exécutable

Pour pouvoir lancer son application en double cliquant sur un fichier et aussi pour pouvoir exporter son code sur un autre ordinateur sans se préoccuper de si python est installé, on peut convertir son code python en fichier exécutable. Pour cela, j’utilise la bibliothèque pyinstaller qui s’installe comme suit :

pip install PyInstaller
  • Ouvrez ensuite un terminal (vous pouvez taper “cmd” dans la barre de recherche)
  • Placez vous dans le dossier contenant votre code python (pour vous déplacer dans un dossier faites “cd nom_du_dossier” et pour revenir au dossier précédent faites “cd..”)
  • Tapez
pyinstaller nom_du_fichier.py
  • Attendez un moment (1 ou 2 minutes maxi) et vérifiez que les dossiers “dist” & “build” ont été générés.
  • Ouvrez le dossier “dist” : vous avez un unique dossier portant le nom de votre code python. Ouvrez à nouveau. Cherchez le fichier .exe présent dans ce dossier : il porte le même nom que votre code python mais aura une extension “.exe”.
  • Créez un raccourci de ce fichier en faisant un click droit dessus, et en cliquant sur “Créer un raccourci”.
  • Placez le raccourci sur votre bureau, et placez le dossier “dist” ou vous voulez.
  • Double-cliquez sur le raccourcis. Votre application se lance!

Exportation du travail

Vous souhaitez faire profiter quelqu’un d’autre de votre travail sans que cette personne ait à installer python sur son ordinateur, ou bien des bibliothèques supplémentaires. C’est facile!!

  • Partagez votre dossier “dist” avec cette personne (les autres dossiers/fichiers générés par pyinstaller sont inutiles pour notre utilisation, vous pourrez les supprimer) par clé USB ou par mail. Pour accélérer le transfert vous pourrez compresser le dossier.
  • La personne devra alors décompresser le dossier s’il était compressé, et ouvrir le dossier pour trouver le fichier exécutable et créer un raccourci pour le placer ou bon lui semble.
  • Pour pouvoir lancer l’application en double-cliquant sur le raccourci, la personne devra être administrateur sur son PC.

☀️☀️☀️☀️Bonne continuation!☀️☀️☀️☀️

--

--

Joséphine Picot

We can do so many things with data, we just have to find a project that thrills us!