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")
A voir également:

5 réponses

Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   168
 
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
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
Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   168
 
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
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
Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   168
 
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
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Phil_1857 Messages postés 1872 Date d'inscription   Statut Membre Dernière intervention   168
 
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
Frewil
 
Bonjour,

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