1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231
|
# Afficher des "Flash cards" constituées d'une image et de 4 informations
# Données venant d'un fichier CSV !
# Avec une barre de menu (en cours...)
# Mode édition : Champs et boutons visibles
# Import de la bibliothèque "TKinter"
from tkinter import *
# Import de la bibliothèque "Pandas" pour les .CSV
import pandas
#########################
# Base de données #
#########################
# Creation d'un objet "DataFrame" à partir d'un fichier .csv
domsys=pandas.read_csv("DOM-SYS.csv", delimiter=",", index_col=0)
# Index du CSV de la carte à afficher
i = -1 # Commencer par -1 pour arriver sur 0 à la première incrémentation
##########################################
# Création de la fenêtre principale #
##########################################
# Création d'une fenêtre TK
root = Tk()
# Configuration de la fenêtre
root.configure(bg="white")
root.title("DOM-SYS")
root.resizable(height=True, width=True)
root.minsize(340, 550) # Taille minimale de la fenêtre (en cas de redimentionnement)
root.iconphoto(False, PhotoImage(file='Icone/Logo-DOM-SYS-150px.png')) # Définir une icône pour l'application. Mais invisible sous Ubuntu ?
###############################################
# Préparation du contenu de l'interface #
###############################################
logo = PhotoImage(file='img/Acc.png') # Préparer une variable pour afficher une image d'accueil
ici_img = PhotoImage(file='Icone/ici-22x22.png')
cnv_img = Canvas(root, width=300, height=300, bg='ivory') # Canvas où sera placée l'image
frame_bt = Frame(root, background="white") # Cadre pour réunir les boutons
# Création des variables de contrôle
nom_i = StringVar(master=root)
pers_i = StringVar(master=root)
act_i = StringVar(master=root)
obj_i = StringVar(master=root)
demande = StringVar(master=root)
# Fonction pour afficher les informations après la modification de "i"
def update():
global i # Aller chercher les variables globales
global logo
print(" i vaut:", i) # Surveiller l'évolution de "i"
logo = PhotoImage(file=domsys.loc[i, "Img"]) # Charger l'adresse de l'image qui correspond à la cellule d'indice "i"
cnv_img.delete('all') # Effacer l'ancienne image
cnv_img.create_image(150, 150, image=logo) # Afficher l'image correspondant à la nouvelle adresse (indice "i")
nom_i.set(domsys.loc[i, "Valeur"]) # Injecter la valeur du DataFrame d'index de ligne "i" dans l'objet "num_i" de type StringVar()
pers_i.set(domsys.loc[i, "Pers"])
act_i.set(domsys.loc[i, "Act"])
obj_i.set(domsys.loc[i, "Obj"])
# Fonction permettant d'incrémenter l'index de la carte à afficher
# "domsys.shape" est une méthode qui renvoit un tuple contenant la taille du DataFrame (ligne,colonne)
# "domsys.shape[0]" renvoie donc un "int" correspondant au nombre de lignes
def incr_i():
global i
i = ((i + 1) % domsys.shape[0]) # Pour ne pas sortir du tableau
update()
# Fonction permettant de décrémenter l'index de la carte à afficher
def decr_i():
global i
i = ((i - 1) % domsys.shape[0]) # Pour ne pas sortir du tableau
update()
# Fonction permettant d'arriver directement à l'index de la carte à afficher
def ici():
global i
global logo
# https://askcodez.com/comment-obtenir-le-numero-de-ligne-dans-le-dataframe-dans-les-pandas.html
# https://moonbooks.org/Articles/Comment-compter-le-nombre-doccurrence-des-elements-dans-la-colonne-dune-dataframe-avec-pandas-en-python-/
# Si il n'y a aucune occurence de la valeur retournée par "demande.get()" dans la colonne 'Valeur' (taille de la liste = 0) Alors, retourner à l'index 0
if (len(domsys[domsys['Valeur'] == demande.get()]))==0:
i = 0
logo = PhotoImage(file="img/VI.png") # Charger l'adresse de l'image d'erreur
cnv_img.delete('all') # Effacer l'ancienne image
cnv_img.create_image(150, 150, image=logo) # Afficher l'image d'erreur
nom_i.set('***') # N'afficher aucune valeur
pers_i.set('***')
act_i.set('***')
obj_i.set('***')
# Si la valeur existe dans la liste, mettre dans "i" la valeur de l'index de la ligne où se trouve cette valeur
else:
i = domsys.loc[domsys['Valeur'] == demande.get()].index[0]
update()
# Fonction d'écriture des données dans le .CSV
def enreg():
domsys.loc[i, "Pers"] = pers_i.get() # Modification du "DataFrame" en fonction des données présentes dans les entrées
domsys.loc[i, "Act"] = act_i.get()
domsys.loc[i, "Obj"] = obj_i.get()
domsys.to_csv('DOM-SYS.csv') # Écriture du "DataFrame" modifié dans le .CSV (écrasement)
#############################################
# Création de la fonction d'affichage #
#############################################
# Création de la fenêtre contenant les informations
def affiche_cart():
nom_i.set('.') # Ne pas afficher de valeur au démarrage
pers_i.set('Personne')
act_i.set('Action')
obj_i.set('Objet')
# Création des Widgets
add_img = Button(root, text="Charger image", command=None)
nom_carte = Label(root, textvariable=nom_i, bg="white", width=5, font=("Courier Bold", 30)) # Création d'un Label
pers_carte = Label(root, textvariable=pers_i, bg="#f2f8a7", width=25)
pers_entr=Entry(root, textvariable=pers_i, width=25)
act_carte = Label(root, textvariable=act_i, bg="#d8b7e8", width=25)
act_entr=Entry(root, textvariable=act_i, width=25)
obj_carte = Label(root, textvariable=obj_i, bg="#b7e8e6", width=25)
obj_entr=Entry(root, textvariable=obj_i, width=25)
btn_next = Button(frame_bt, text="Suivant >", command=incr_i)
entree=Entry(frame_bt, textvariable=demande, width=3)
btn_ici = Button(frame_bt, image=ici_img, command=ici)
btn_back = Button(frame_bt, text="< Précédent", command=decr_i)
btn_enreg = Button(root, text="Enregistrer les modifications", command=enreg)
######################################
# Création de la barre de menu #
######################################
bar_menu = Menu(root, background='#ffffff', foreground='#000000',
activebackground='#f7f1d0', activeforeground='#000000')
root.config(menu=bar_menu)
# Fonctions activées par les menus
def mode_feuil(): # Cacher les champs d'entrées
add_img.pack_forget()
pers_entr.pack_forget()
act_entr.pack_forget()
obj_entr.pack_forget()
btn_enreg.pack_forget()
def vider(): # Cacher tous les widgets (Pour un réaffichage)
cnv_img.pack_forget()
add_img.pack_forget()
nom_carte.pack_forget()
pers_carte.pack_forget()
pers_entr.pack_forget()
act_carte.pack_forget()
act_entr.pack_forget()
obj_carte.pack_forget()
obj_entr.pack_forget()
frame_bt.pack_forget()
btn_back.pack_forget()
entree.pack_forget()
btn_ici.pack_forget()
btn_next.pack_forget()
btn_enreg.pack_forget()
def mode_edit(): # Afficher tous les widgets (entrées incluses)
vider()
cnv_img.pack(padx=15, pady=15)
cnv_img.create_image(150, 150, image=logo)
add_img.pack()
nom_carte.pack(padx=10, pady=5)
pers_carte.pack(padx=10, pady=5)
pers_entr.pack()
act_carte.pack(padx=10, pady=5)
act_entr.pack()
obj_carte.pack(padx=10, pady=5)
obj_entr.pack()
frame_bt.pack()
btn_back.pack(side=LEFT, padx=10, pady=15)
entree.delete(0,'end') # Vider le champ pour éviter les accumulations
entree.insert(0, "00") # Mettre 0 comme valeur par défaut dans "entree"
entree.pack(side=LEFT, padx=5, pady=15)
btn_ici.pack(side=LEFT, padx=5, pady=10)
btn_next.pack(side=RIGHT, padx=10, pady=10)
btn_enreg.pack(padx=10, pady=10)
def quit(): # Ferme le programme
sys.exit()
# Menu "Fichier"
fichier = Menu(bar_menu, tearoff=0, background='#ffffff', foreground='#000000',
activebackground='#f7f1d0', activeforeground='#000000')
fichier.add_command(label="Ouvrir", command=None)
fichier.add_command(label="Enregistrer", command=None)
fichier.add_command(label="Créer une sauvegarde", command=None)
fichier.add_separator()
fichier.add_command(label="Fermer", command=quit)
bar_menu.add_cascade(label="Fichier", menu=fichier)
# Menu "Edition"
edition = Menu(bar_menu, tearoff=0, background='#ffffff', foreground='#000000',
activebackground='#f7f1d0', activeforeground='#000000')
edition.add_command(label="Mode feuilletage", command=mode_feuil)
edition.add_command(label="Mode édition", command=mode_edit)
bar_menu.add_cascade(label="Édition", menu=edition)
# Menu "Affichage"
affich = Menu(bar_menu, tearoff=0, background='#ffffff', foreground='#000000',
activebackground='#f7f1d0', activeforeground='#000000')
affich.add_command(label="Mode clair", command=None)
affich.add_command(label="Mode sombre", command=None)
# affich.add_command(label="Vider", command=vider)
bar_menu.add_cascade(label="Affichage", menu=affich)
# Menu "Aide"
aide = Menu(bar_menu, tearoff=0, background='#ffffff', foreground='#000000',
activebackground='#f7f1d0', activeforeground='#000000')
aide.add_command(label="Manuel", command=None)
aide.add_command(label="À propos de DOM-SYS", command=None)
bar_menu.add_cascade(label="Aide", menu=aide)
mode_edit()
mode_feuil()
root.mainloop()
# Appel de la fonction d'affichage
affiche_cart() |
Partager