Bonjour,
Il faut dire que ton code est une vraie "usine à gaz " :-) :-)
en général, on structure comme ceci:
imports
définitions de fonctions
programme principal
Voici une version qui fonctionne, à noter les 2 boucles pour réduire le nombre de lignes de création
de label_total_elec et de calcul de total_elec par année (lignes 21 et 55 )
# -*- coding:Utf-8 -*-
import sqlite3
import tkinter
import tkinter as tk
from tkinter import *
from tkinter import messagebox, ttk
from tkinter.ttk import Treeview
#from tkcalendar import DateEntry
def sum_elec(curs):
''' calcul des totaux annuels à partir des donnéees dans la table Electricté de la base données principale '''
global total_elec, total_elec_2021, total_elec_2022
find_sum_total_elec = "select sum(montant_facture_elec) from Electricite"
curs.execute(find_sum_total_elec)
total_elec_g = (curs.fetchone()[0])
print("Total global: ", total_elec_g)
total_elec = {}
for k in range(1,11):
an = 2020+k
sql_request = f'select sum(montant_facture_elec) from Electricite where date_facture_elec like "%'+str(an)+'"'
curs.execute(sql_request)
total_elec[an] = curs.fetchone()[0]
print('total {} : {}€'.format(an,total_elec[an]))
def appartement_database():
''' Creation de la base de donnees principale pour enregistrer les données '''
connection = sqlite3.connect(BDD)
curs = connection.cursor()
curs.execute(
"CREATE TABLE IF NOT EXISTS Electricite (Id INTEGER PRIMARY KEY, date_facture_elec TEXT, "
"montant_facture_elec TEXT, Ref_facture_elec TEXT)")
curs.execute("SELECT * FROM Electricite")
sum_elec(curs)
curs.close()
connection.close()
def calc_total_annuel(window_electricite):
''' Afficher dans la vue electricite les totaux annuels calculés '''
global total_elec, total_elec_2021,total_elec_2022
# création du frame pour accueillir les totaux annuels
frame3 = ttk.LabelFrame(window_electricite, text="Total annuel", width=200, height=280)
frame3.place(x=685, y=16)
# création des labels avec les totaux annuels
label_total_elec = {}
yp=38
for k in range(1,11):
an = 2020+k
label_total_elec[an] = Label(window_electricite, text="Montant total {}: {} €".format(an, total_elec[an]))
label_total_elec[an].place(x=700, y=yp)
yp+=20
def treeview_for_electricite_database(window_electricite):
'''création du treeview pour afficher les données de la table Electricite dans la base de données principale '''
global tree_elec
connection = sqlite3.connect(BDD)
curs = connection.cursor()
curs.execute("SELECT * FROM Electricite")
result_elec = curs.fetchall()
for row in result_elec: tree_elec.insert('', 'end', values=(row[0], row[1], row[2], row[3]))
curs.close()
connection.close()
def add_data_in_elec_table():
''' Ajouter des données dans la table Electricite de la base de donnees Appartement '''
global entry_date_facture_elec, entry_montant_facture_elec, entry_reference_facture_elec, tree_elec
date_facture_elec = entry_date_facture_elec.get()
montant_facture_elec = entry_montant_facture_elec.get()
reference_facture_elec = entry_reference_facture_elec.get()
connection = sqlite3.connect(BDD)
curs = connection.cursor()
curs.execute("INSERT INTO Electricite (date_facture_elec, montant_facture_elec, Ref_facture_elec)"
"VALUES(?,?,?)", (date_facture_elec, montant_facture_elec, reference_facture_elec))
connection.commit()
for item in tree_elec.get_children(): tree_elec.delete(item)
curs.execute("SELECT * FROM Electricite")
result_elec = curs.fetchall()
for row in result_elec: tree_elec.insert('', 'end', values=(row[0], row[1], row[2], row[3]))
entry_montant_facture_elec.delete(0, END)
entry_reference_facture_elec.delete(0, END)
sum_elec(curs)
curs.close()
connection.close()
def delete_data_in_elec_table():
''' Supprime des données de la table '''
global tree_elec, window_electricite
if not tree_elec.selection(): # Teste si une ligne a été sélectionnée avant d'exécuter l'instruction delete
frame2 = Label(window_electricite, text="Veuillez sélectionner une ligne", fg="#F00020", font="Arial 12")
frame2.place(x=85, y=270)
frame2.after(3000, frame2.destroy)
else:
iid = tree_elec.focus() # Obtient l'iid de la ligne sélectionnée et qui a le focus
sup_row = tree_elec.set(iid, "Id")
tree_elec.delete(iid)
connection = sqlite3.connect(BDD)
curs = connection.cursor()
curs.execute("DELETE FROM Electricite WHERE Id = ?", (sup_row,))
connection.commit()
frame2 = Label(window_electricite, text="Facture supprimée", fg="#F00020", font="Arial 12")
frame2.place(x=125, y=270)
frame2.after(3000, frame2.destroy) # effacer le message après 3000 ms
sum_elec(curs) # recalculer la somme totale
curs.close()
connection.close()
def close_window_electricite():
window_electricite.destroy()
def create_electricite_window():
global entry_date_facture_elec, entry_montant_facture_elec, entry_reference_facture_elec, window_electricite
global tree_elec
window_electricite = tkinter.Toplevel()
window_electricite.title("Dépenses en électricité")
window_electricite.geometry("900x400")
window_electricite.resizable(width=False, height=False)
appartement_database()
calc_total_annuel(window_electricite)
frame1 = ttk.LabelFrame(window_electricite, text="Electricité", width=370, height=280)
frame1.place(x=15, y=16)
# entree de la date de facture electricite
label_date_facture_elec = Label(window_electricite, text="Date de la facture")
label_date_facture_elec.place(x=30, y=50)
entry_date_facture_elec = Entry(window_electricite, text='')
entry_date_facture_elec.place(x=140, y=50)
# entree du montant de la facture electricite
label_montant_facture_elec = Label(window_electricite, text="Montant facture")
label_montant_facture_elec.place(x=30, y=90)
entry_montant_facture_elec = Entry(window_electricite, width=30)
entry_montant_facture_elec.focus()
entry_montant_facture_elec.place(x=140, y=90)
# entree reference facture electricite
label_reference_facture_elec = Label(window_electricite, text="Référence facture")
label_reference_facture_elec.place(x=30, y=130)
entry_reference_facture_elec = Entry(window_electricite, width=30)
entry_reference_facture_elec.place(x=140, y=130)
bouton1 = ttk.Button(window_electricite, text="Ajouter", command=add_data_in_elec_table)
bouton1.place(x=30, y=180)
bouton2 = ttk.Button(window_electricite, text="Supprimer", command=delete_data_in_elec_table)
bouton2.place(x=132, y=180)
bouton3 = ttk.Button(window_electricite, text="Modifier")
bouton3.place(x=235, y=180)
bouton4 = ttk.Button(window_electricite, text="Quitter", command=close_window_electricite)
bouton4.place(x=30, y=220)
treeview_for_electricite_database(window_electricite)
tree_elec = Treeview(window_electricite, columns=("Id", "Date", "Montant", "Référence"), show="headings")
tree_elec.heading('Id', text="Id")
tree_elec.heading('Date', text="Date")
tree_elec.heading('Montant', text="Montant")
tree_elec.heading('Référence', text="Référence")
tree_elec.column("Id", anchor=CENTER, width=20)
tree_elec.column("Date", anchor=CENTER, width=70)
tree_elec.column("Montant", anchor=CENTER, width=70)
tree_elec.column("Référence", anchor=CENTER, width=70)
tree_elec.place(x=420, y=25)
#Programme principal
BDD = "Appartement_database.db"
main = tk.Tk()
main.title("Gestion appartement")
main.geometry("700x500")
menubar = Menu(main)
main.config(menu=menubar)
menufichier = Menu(menubar)
menubar.add_cascade(label="Fichier", menu=menufichier)
menufichier.add_cascade(label='Exit', command=main.destroy)
menuaffichage = Menu(menubar)
menubar.add_cascade(label="Affichage", menu=menuaffichage)
sub_menu = Menu(menuaffichage)
sub_menu.add_command(label="Electricité", command=create_electricite_window)
sub_menu.add_command(label="2")
sub_menu.add_command(label="3")
menuaffichage.add_cascade(label='Dépenses', menu=sub_menu)
menuaffichage.add_command(label='Recettes', command=sub_menu)
main.mainloop()
19 févr. 2022 à 15:03
Merci pour ta réponse.
Le code complet est le suivant: