AttributeError: module 'mysql.connector.cursor' has no attri
Frewil
-
Frewil -
Frewil -
Bonjour,
Lorsque le morceau de script ci-dessous s'execute, le message
"AttributeError: module 'mysql.connector.cursor' has no attribute 'execute'"
est affiché.
Je n'arrive pas à comprendre ce qui est faut dans mon code.
Merci pour votre aide.
Lorsque le morceau de script ci-dessous s'execute, le message
"AttributeError: module 'mysql.connector.cursor' has no attribute 'execute'"
est affiché.
Je n'arrive pas à comprendre ce qui est faut dans mon code.
Merci pour votre aide.
def treeview_for_electricite_database():
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)
cursor.execute("SELECT * FROM Electricite")
result_elec = cursor.fetchall()
for row in result_elec:
tree_elec.insert('', 'end', values=(row[0], row[1], row[2], row[3]))
print("Affichage de la table Electricite (Treeview) crée dans la vue Electricite")
5 réponses
-
Bonjour,
On ne voit pas tout le code
As-tu bien défini le cursor comme ici mais avec un autre nom que cursor puisque c'est déjà le nom de l'objet Python:import sqlite3 connexion = sqlite3.connect(database) curs =connexion.cursor() curs.execute('"SELECT * FROM Electricite"')-
Bonjour,
Merci pour ta réponse.
Le code complet est le suivant:
import sqlite3 import tkinter import tkinter as tk from tkinter import * from tkinter import messagebox, ttk from tkinter.ttk import Treeview from mysql.connector import cursor, connection from tkcalendar import DateEntry # Creation de la fenetre principale avec sa barre de menu def create_main_window(): main = tk.Tk() main.title("Gestion appartement") main.geometry("1200x1000") print("fenetre principale créée") main.tk.call("source", "azure.tcl") main.tk.call("set_theme", "light") print("thème appliqué") # Creation de la barre de menu menubar = Menu(main) main.config(menu=menubar) # Ajouter le menu Fichier et son sous-menu "Exit" dans la barre de menu menufichier = Menu(menubar) menubar.add_cascade(label="Fichier", menu=menufichier) menufichier.add_cascade(label='Exit', command=main.destroy, ) # Ajouter le menu "Affichage" dans la barre de menu menuaffichage = Menu(menubar) menubar.add_cascade(label="Affichage", menu=menuaffichage) # Ajouter Menu "Dépenses" avec ses sous-menus dans "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) # Ajouter le menu "Recettes" dans "menuaffichage" menuaffichage.add_command(label='Recettes', command=main.destroy, ) print("barre de menu créée") main.mainloop() # Creation de la fenetre Electricite def create_electricite_window(sum_elec=None, table_for_electricite_database=None): #Création du cadre de la vue electricité window_electricite = tkinter.Toplevel() window_electricite.title("Dépenses en électricité") window_electricite.geometry("1400x800") window_electricite.resizable(width=False, height=False) print("frame principal de la fenetre Electrixite crée") # Creation de la base de donnees principale pour enregistrer les donnéées def appartement_database(): connection = sqlite3.connect("Appartement_database.db") print("Base de données principale Appartement connectée") curs = connection.cursor() curs.execute("SELECT * FROM Electricite") # creation de la table Electricite dans la base de données principale Appartement curs.execute( "CREATE TABLE IF NOT EXISTS Electricite (Id INTEGER PRIMARY KEY, date_facture_elec TEXT, " "montant_facture_elec TEXT, Ref_facture_elec TEXT)") print("Table Electricite créée ou connectée dans la base principale Appartement") # calcul des totaux annuels à partir des donnéees dans la table Electricté de la base données principale def sum_elec(): find_sum_total_elec = "select sum(montant_facture_elec) from Electricite" curs.execute(find_sum_total_elec) total_elec = (curs.fetchone()[0]) print("Total global: ", total_elec) curs.execute(f'select sum(montant_facture_elec) from Electricite where date_facture_elec like "%2021"') total_elec_2021 = (curs.fetchone()[0]) print('total 2021: ', str(total_elec_2021) + " €") curs.execute(f'select sum(montant_facture_elec) from Electricite where date_facture_elec like "%2022"') total_elec_2022 = (curs.fetchone()[0]) print('total 2022: ', str(total_elec_2022) + " €") curs.execute(f'select sum(montant_facture_elec) from Electricite where date_facture_elec like "%2023"') total_elec_2023 = (curs.fetchone()[0]) print('total 2023: ', str(total_elec_2023) + " €") curs.execute(f'select sum(montant_facture_elec) from Electricite where date_facture_elec like "%2024"') total_elec_2024 = (curs.fetchone()[0]) print('total 2024: ', str(total_elec_2024) + " €") curs.execute(f'select sum(montant_facture_elec) from Electricite where date_facture_elec like "%2025"') total_elec_2025 = (curs.fetchone()[0]) print('total 2025: ', str(total_elec_2025) + " €") curs.execute(f'select sum(montant_facture_elec) from Electricite where date_facture_elec like "%2026"') total_elec_2026 = (curs.fetchone()[0]) print('total 2026: ', str(total_elec_2026) + " €") curs.execute(f'select sum(montant_facture_elec) from Electricite where date_facture_elec like "%2027"') total_elec_2027 = (curs.fetchone()[0]) print('total 2027: ', str(total_elec_2027) + " €") curs.execute(f'select sum(montant_facture_elec) from Electricite where date_facture_elec like "%2029"') total_elec_2028 = (curs.fetchone()[0]) print('total 2028: ', str(total_elec_2028) + " €") curs.execute(f'select sum(montant_facture_elec) from Electricite where date_facture_elec like "%2029"') total_elec_2029 = (curs.fetchone()[0]) print('total 2029: ', str(total_elec_2029) + " €") curs.execute(f'select sum(montant_facture_elec) from Electricite where date_facture_elec like "%2030"') total_elec_2030 = (curs.fetchone()[0]) print('total 2030: ', str(total_elec_2030) + " €") print("Calcul de totaux annuels réalisé") sum_elec() # Afficher dans la vue electricite les totaux annuels calculés def calc_total_annuel(total_elec_2021=None, total_elec_2022=None, total_elec_2023=None, total_elec_2024=None, total_elec_2025=None, total_elec_2026=None, total_elec_2027=None, total_elec_2028=None, total_elec_2029=None, total_elec_2030=None): # création du frame pour accueillir les totaux annuels frame3 = ttk.LabelFrame(window_electricite, text="Total annuel", width=200, height=280) frame3.place(x=810, y=16) print("Frame crée dans la fenetre Electricite pour accueillir les totaux annuels") # création des labels avec les totaux annuels label_total_elec_2021 = Label(window_electricite, text="Montant total 2021: " + str(total_elec_2021) + " €") label_total_elec_2021.place(x=825, y=38) label_total_elec_2022 = Label(window_electricite, text="Montant total 2022: " + str(total_elec_2022) + " €") label_total_elec_2022.place(x=825, y=58) label_total_elec_2023 = Label(window_electricite, text="Montant total 2023: " + str(total_elec_2023) + " €") label_total_elec_2023.place(x=825, y=78) label_total_elec_2024 = Label(window_electricite, text="Montant total 2024: " + str(total_elec_2024) + " €") label_total_elec_2024.place(x=825, y=98) label_total_elec_2025 = Label(window_electricite, text="Montant total 2025: " + str(total_elec_2025) + " €") label_total_elec_2025.place(x=825, y=118) label_total_elec_2026 = Label(window_electricite, text="Montant total 2026: " + str(total_elec_2026) + " €") label_total_elec_2026.place(x=825, y=138) label_total_elec_2027 = Label(window_electricite, text="Montant total 2027: " + str(total_elec_2027) + " €") label_total_elec_2027.place(x=825, y=158) label_total_elec_2028 = Label(window_electricite, text="Montant total 2028: " + str(total_elec_2028) + " €") label_total_elec_2028.place(x=825, y=178) label_total_elec_2029 = Label(window_electricite, text="Montant total 2029: " + str(total_elec_2029) + " €") label_total_elec_2029.place(x=825, y=198) label_total_elec_2030 = Label(window_electricite, text="Montant total 2030: " + str(total_elec_2030) + " €") label_total_elec_2030.place(x=825, y=218) print("totaux annuels affichés dans la vue Electricite") # appel de fonctions appartement_database() calc_total_annuel() frame1 = ttk.LabelFrame(window_electricite, text="Electricité", width=370, height=280) frame1.place(x=15, y=16) print("Frame crée dans la fenetre Electricite pour accueillir les boutons et les entrées") # frame2 dans la fonction "delete_data_in_elec_table()" # 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 = DateEntry(window_electricite, date_pattern='dd/mm/y') entry_date_facture_elec.place(x=140, y=50) print("champs d'entrée de la date de la facture electricité crée") # 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) print("champs d'entrée du montant de la facture electricité crée") # 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) print("champs d'entrée de la référence de la facture electricité crée") # Ajouter des données dans la table Electricite de la base de donnees Appartement def add_data_in_elec_table(entry_date_facture_elec=None, entry_montant_facture_elec=None, entry_reference_facture_elec=None, tree_elec=None): # definition de variables date_facture_elec = entry_date_facture_elec.get() montant_facture_elec = entry_montant_facture_elec.get() reference_facture_elec = entry_reference_facture_elec.get() 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) # vider le champs Montant après avoir cliqué sur Ajouter et complété la base de données entry_reference_facture_elec.delete(0, END) # vider le champs Référence après avoir cliqué sur Ajouter et complété la base de données sum_elec() # recalculer la somme totale # bouton "Ajouter" bouton1 = ttk.Button(window_electricite, text="Ajouter", command=add_data_in_elec_table) bouton1.place(x=30, y=180) print("bouton Ajouter crée") # création du treeview pour afficher les donnéées de la table Electricite dans la base de données principale def treeview_for_electricite_database(curs=None): 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) 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])) print("Affichage de la table Electricite (Treeview) crée dans la vue Electricite") treeview_for_electricite_database() # Supprimer des donnees dans la table Electricite de la base de donnees Appartement def delete_data_in_elec_table(tree_elec=None, window_electricite=None, curs=None): if not tree_elec.selection(): # Teste si une ligne a été sélectionnée avant d'exécuter l'instruction SQL 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: # result = messagebox.askquestion("Electricité", "Etes-vous sûr de vouloir supprimer cette facture", # icon="warning") if result == 'yes': 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) curs.execute("DELETE FROM Electricite WHERE Id = ?", (sup_row,)) 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() # recalculer la somme totale # bouton "Supprimer" bouton2 = ttk.Button(window_electricite, text="Supprimer", command=delete_data_in_elec_table) bouton2.place(x=132, y=180) print("bouton Supprimer crée") # bouton "Modifier" bouton3 = ttk.Button(window_electricite, text="Modifier") bouton3.place(x=235, y=180) print("bouton Modifier crée") def close_window_electricite(window_electricite=None): window_electricite.destroy() bouton4 = ttk.Button(window_electricite, text="Quitter", command=close_window_electricite) bouton4.place(x=30, y=220) print("bouton Quitter crée") create_main_window()
-
-
Bonjour,
Ah! le code a changé
maintenant, c'est curs.execute...
Le curseur est initialisé dans appartement_database()
Mais est-il connu dans les autres fonctions ?
(portée des variables )-
Bonjour,
Merci de m'avoir mis sur la voie.
Par contre, cela me génère d'autres messages comme
AttributeError: 'NoneType' object has no attribute 'get_children'
ou encore
AttributeError: 'NoneType' object has no attribute 'selection'
si je lance les fonctions associées aux boutons Ajouter ou Supprimer
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 # Creation de la fenetre principale avec sa barre de menu def create_main_window(): main = tk.Tk() main.title("Gestion appartement") main.geometry("1200x1000") print("fenetre principale créée") main.tk.call("source", "azure.tcl") main.tk.call("set_theme", "light") print("thème appliqué") # Creation de la barre de menu menubar = Menu(main) main.config(menu=menubar) # Ajouter le menu Fichier et son sous-menu "Exit" dans la barre de menu menufichier = Menu(menubar) menubar.add_cascade(label="Fichier", menu=menufichier) menufichier.add_cascade(label='Exit', command=main.destroy, ) # Ajouter le menu "Affichage" dans la barre de menu menuaffichage = Menu(menubar) menubar.add_cascade(label="Affichage", menu=menuaffichage) # Ajouter Menu "Dépenses" avec ses sous-menus dans "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) # Ajouter le menu "Recettes" dans "menuaffichage" menuaffichage.add_command(label='Recettes', command=main.destroy, ) print("barre de menu créée") main.mainloop() # Creation de la fenetre Electricite def create_electricite_window(sum_elec=None): # Création du cadre de la vue electricité window_electricite = tkinter.Toplevel() window_electricite.title("Dépenses en électricité") window_electricite.geometry("1400x800") window_electricite.resizable(width=False, height=False) print("frame principal de la fenetre Electrixite crée") # Creation de la base de donnees principale pour enregistrer les donnéées def appartement_database(): connection = sqlite3.connect("Appartement_database.db") print("Base de données principale Appartement connectée") curs = connection.cursor() curs.execute("SELECT * FROM Electricite") # creation de la table Electricite dans la base de données principale Appartement curs.execute( "CREATE TABLE IF NOT EXISTS Electricite (Id INTEGER PRIMARY KEY, date_facture_elec TEXT, " "montant_facture_elec TEXT, Ref_facture_elec TEXT)") print("Table Electricite créée ou connectée dans la base principale Appartement") # calcul des totaux annuels à partir des donnéees dans la table Electricté de la base données principale def sum_elec(): find_sum_total_elec = "select sum(montant_facture_elec) from Electricite" curs.execute(find_sum_total_elec) total_elec = (curs.fetchone()[0]) print("Total global: ", total_elec) curs.execute(f'select sum(montant_facture_elec) from Electricite where date_facture_elec like "%2021"') total_elec_2021 = (curs.fetchone()[0]) print('total 2021: ', str(total_elec_2021) + " €") curs.execute(f'select sum(montant_facture_elec) from Electricite where date_facture_elec like "%2022"') total_elec_2022 = (curs.fetchone()[0]) print('total 2022: ', str(total_elec_2022) + " €") curs.execute(f'select sum(montant_facture_elec) from Electricite where date_facture_elec like "%2023"') total_elec_2023 = (curs.fetchone()[0]) print('total 2023: ', str(total_elec_2023) + " €") curs.execute(f'select sum(montant_facture_elec) from Electricite where date_facture_elec like "%2024"') total_elec_2024 = (curs.fetchone()[0]) print('total 2024: ', str(total_elec_2024) + " €") curs.execute(f'select sum(montant_facture_elec) from Electricite where date_facture_elec like "%2025"') total_elec_2025 = (curs.fetchone()[0]) print('total 2025: ', str(total_elec_2025) + " €") curs.execute(f'select sum(montant_facture_elec) from Electricite where date_facture_elec like "%2026"') total_elec_2026 = (curs.fetchone()[0]) print('total 2026: ', str(total_elec_2026) + " €") curs.execute(f'select sum(montant_facture_elec) from Electricite where date_facture_elec like "%2027"') total_elec_2027 = (curs.fetchone()[0]) print('total 2027: ', str(total_elec_2027) + " €") curs.execute(f'select sum(montant_facture_elec) from Electricite where date_facture_elec like "%2029"') total_elec_2028 = (curs.fetchone()[0]) print('total 2028: ', str(total_elec_2028) + " €") curs.execute(f'select sum(montant_facture_elec) from Electricite where date_facture_elec like "%2029"') total_elec_2029 = (curs.fetchone()[0]) print('total 2029: ', str(total_elec_2029) + " €") curs.execute(f'select sum(montant_facture_elec) from Electricite where date_facture_elec like "%2030"') total_elec_2030 = (curs.fetchone()[0]) print('total 2030: ', str(total_elec_2030) + " €") print("Calcul de totaux annuels réalisé") sum_elec() # Afficher dans la vue electricite les totaux annuels calculés def calc_total_annuel(total_elec_2021=None, total_elec_2022=None, total_elec_2023=None, total_elec_2024=None, total_elec_2025=None, total_elec_2026=None, total_elec_2027=None, total_elec_2028=None, total_elec_2029=None, total_elec_2030=None): # création du frame pour accueillir les totaux annuels frame3 = ttk.LabelFrame(window_electricite, text="Total annuel", width=200, height=280) frame3.place(x=810, y=16) print("Frame crée dans la fenetre Electricite pour accueillir les totaux annuels") # création des labels avec les totaux annuels label_total_elec_2021 = Label(window_electricite, text="Montant total 2021: " + str(total_elec_2021) + " €") label_total_elec_2021.place(x=825, y=38) label_total_elec_2022 = Label(window_electricite, text="Montant total 2022: " + str(total_elec_2022) + " €") label_total_elec_2022.place(x=825, y=58) label_total_elec_2023 = Label(window_electricite, text="Montant total 2023: " + str(total_elec_2023) + " €") label_total_elec_2023.place(x=825, y=78) label_total_elec_2024 = Label(window_electricite, text="Montant total 2024: " + str(total_elec_2024) + " €") label_total_elec_2024.place(x=825, y=98) label_total_elec_2025 = Label(window_electricite, text="Montant total 2025: " + str(total_elec_2025) + " €") label_total_elec_2025.place(x=825, y=118) label_total_elec_2026 = Label(window_electricite, text="Montant total 2026: " + str(total_elec_2026) + " €") label_total_elec_2026.place(x=825, y=138) label_total_elec_2027 = Label(window_electricite, text="Montant total 2027: " + str(total_elec_2027) + " €") label_total_elec_2027.place(x=825, y=158) label_total_elec_2028 = Label(window_electricite, text="Montant total 2028: " + str(total_elec_2028) + " €") label_total_elec_2028.place(x=825, y=178) label_total_elec_2029 = Label(window_electricite, text="Montant total 2029: " + str(total_elec_2029) + " €") label_total_elec_2029.place(x=825, y=198) label_total_elec_2030 = Label(window_electricite, text="Montant total 2030: " + str(total_elec_2030) + " €") label_total_elec_2030.place(x=825, y=218) print("totaux annuels affichés dans la vue Electricite") # appel de fonctions appartement_database() calc_total_annuel() frame1 = ttk.LabelFrame(window_electricite, text="Electricité", width=370, height=280) frame1.place(x=15, y=16) print("Frame crée dans la fenetre Electricite pour accueillir les boutons et les entrées") # frame2 dans la fonction "delete_data_in_elec_table()" # 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 = DateEntry(window_electricite, date_pattern='dd/mm/y') entry_date_facture_elec.place(x=140, y=50) print("champs d'entrée de la date de la facture electricité crée") # 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) print("champs d'entrée du montant de la facture electricité crée") # 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) print("champs d'entrée de la référence de la facture electricité crée") # création du treeview pour afficher les donnéées de la table Electricite dans la base de données principale def treeview_for_electricite_database(): 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) connection = sqlite3.connect("Appartement_database.db") print("Base de données principale Appartement connectée") 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])) print("Affichage de la table Electricite (Treeview) crée dans la vue Electricite") # Ajouter des données dans la table Electricite de la base de donnees Appartement def add_data_in_elec_table(tree_elec=None): # definition de variables 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("Appartement_database.db") print("Base de données principale Appartement connectée") 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) connection = sqlite3.connect("Appartement_database.db") print("Base de données principale Appartement connectée") 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])) entry_montant_facture_elec.delete(0, END) # vider le champs Montant après avoir cliqué sur Ajouter et complété # la base de données entry_reference_facture_elec.delete(0, END) # vider le champs Référence après avoir cliqué sur Ajouter et # complété la base de données sum_elec() # recalculer la somme totale # bouton "Ajouter" bouton1 = ttk.Button(window_electricite, text="Ajouter", command=add_data_in_elec_table) bouton1.place(x=30, y=180) print("bouton Ajouter crée") treeview_for_electricite_database() # Supprimer des donnees dans la table Electricite de la base de donnees Appartement def delete_data_in_elec_table(tree_elec=None): 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: # result = messagebox.askquestion("Electricité", "Etes-vous sûr de vouloir supprimer cette facture", # icon="warning") if result == 'yes': 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("Appartement_database.db") print("Base de données principale Appartement connectée") curs = connection.cursor() curs.execute("DELETE FROM Electricite WHERE Id = ?", (sup_row,)) 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() # recalculer la somme totale # bouton "Supprimer" bouton2 = ttk.Button(window_electricite, text="Supprimer", command=delete_data_in_elec_table) bouton2.place(x=132, y=180) print("bouton Supprimer crée") # bouton "Modifier" bouton3 = ttk.Button(window_electricite, text="Modifier") bouton3.place(x=235, y=180) print("bouton Modifier crée") def close_window_electricite(): window_electricite.destroy() bouton4 = ttk.Button(window_electricite, text="Quitter", command=close_window_electricite) bouton4.place(x=30, y=220) print("bouton Quitter crée") create_main_window()
-
-
Bonjour,
AttributeError: 'NoneType' object has no attribute 'get_children'
c'est surement à la lignetree_elec.get_children()
donc, à ce moment, l'objet tree_elec est surement vide et on ne peut donc pas aller chercher son attribut get_children
Moi, j'ai une erreur ici:curs.execute("SELECT * FROM Electricite")
sqlite3.OperationalError: no such table: Electricite
Normal : la table est définie juste après, donc elle n'est pas encore connue à ce stade
Pourquoi définir des fonctions dans d'autre fonctions ? -
Bonjour,
Merci pour ta réponse.
Il va falloir que je m'y penche plus en détail, car je n'arrive pas à résoudre, même en suivant tes conseils -
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
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()