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

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.

 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. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     
    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"')
    0
    1. Frewil
       
      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()
      0
  2. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     
    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 )
    0
    1. Frewil
       
      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()
      
      0
  3. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     
    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 ?
    0
  4. Frewil
     
    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
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Phil_1857 Messages postés 1883 Date d'inscription   Statut Membre Dernière intervention   169
     
    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()
    0
    1. Frewil
       
      Bonjour,

      Un très grand merci. C'est vraiment très sympa :-)
      0