AttributeError: module 'mysql.connector.cursor' has no attri

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.

 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

  1. 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()
    1. Bonjour,

      Un très grand merci. C'est vraiment très sympa :-)
  2. 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
    1. Bonjour,

      AttributeError: 'NoneType' object has no attribute 'get_children'
      c'est surement à la ligne
      tree_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 ?
      1. 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 )
        1. 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()
          
      2. 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"')
        1. 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()