Partage
  • Partager sur Facebook
  • Partager sur Twitter

Blocage Python + Tkinter

Exercice gestion de ressources de CDI

Sujet résolu
    16 octobre 2021 à 22:13:07

    Bonjour, 

    Je suis en Terminale avec spécialité NSI, je fais un mini-projet qui consiste à réaliser une application de gestion des ressources d'un CDI. Cette application doit gèrer les ajouts, les suppressions, les emprunts et les retours des ressources du CDI.

    L’application doit assurer les fonctions suivantes :

    La gestion des ouvrages : le programme doit permettre la saisie des informations des différents ouvrages. Le programme permet également la modification, suppression et la recherche des ouvrages...

    [...]

    Pour stocker mes livres, j'utilise des listes : une pour les titres, une pour les auteurs et une pour les dates de parution. On peut les relier grâce aux index (le titre[0] va avec l'auteur[0] et avec la date[0]).

    Ici, on ne s'intéresse qu'à la modification des titres des livres (ce sera a peu près la même chose pour les auteurs et les dates), je stocke les titres dans une liste

    LtitresOuvrages = ["La Conjuration des imbéciles", "Le Horla",  "Marelle", "L'Appel de la forêt", "Fahrenheit 451"]

    Cette liste peut durant l'éxécution du programme, être modifié (des titres peuvent être ajoutés, modifiés ou supprimés).

    Dans ma fonction, je la transforme en dictionnaire ; avec comme KEY "BoutonX" (X étant un chiffre défini grâce au compteur) et comme VALUES le titre du livre ; grâce à : 

        titre_dict = {}
    
        compteur = 0
    
        for nb in range(len(LtitresOuvrages)):
    
            titre_dict["Bouton%s" %nb] = LtitresOuvrages[compteur]
    
            compteur += 1
    
        print(titre_dict)

    Ensuite, j'affiche chaque VALUES du dictionnaire titre_dict dans un bouton (fenetre 3 de l'image) grâce à : 

        for elt in titre_dict.values():
    
            Button(toplevel, text=f"{elt}", borderwidth=1, command = lambda: Mouvrages(elt)).pack()

    J'utilise lambda car sinon 

    command = Mouvrages

    ne prend pas l'attribut elt

    Donc dans mon dictionnaire, j'ai en KEY BoutonX et comme VALUE un titre de livre.

    {'Bouton0': 'La Conjuration des imbéciles', 'Bouton1': 'Le Horla', 'Bouton2': 'Marelle', 'Bouton3': "L'Appel de la forêt", 'Bouton4': 'Fahrenheit 451'}

    J'aimerais que la KEY soit la variable dans laquelle est stocké le bouton. Mais je ne sais pas comment m'y prendre... Car ce qu'il se passe, c'est que par la suite, je ne sais pas comment savoir quel bouton est pressé, donc quel livre veut être modifié... 

    Dans Mouvrages(elt), je voudrais afficher la fenetre 4 (elle s'affiche en cliquant sur les boutons, ce n'est pas le problème) et qu'on puisse modifier le bon livre car actuellement elt prend le dernier livre de la liste (logique).

    Je vous mets le code (~ 300 lignes): les lignes qui nous intéressent sont à partir de ## Fenetre Ajouter, Modifier ou Supprimer > Modifier Ouvrages

    print("Programme lancé !")
    
    from tkinter import *
    #from tkMessageBox import * #python 2
    from tkinter.messagebox import * #python 3
    import os.path
    
    LtitresOuvrages = ["La Conjuration des imbéciles", "Le Horla",  "Marelle", "L'Appel de la forêt", "Fahrenheit 451"]
    
    ## Fenetre Ajouter, Modifier ou  Supprimer
    def AMS():
        def quitter2():
            toplevel.destroy()
            fenetre.deiconify()
    
        toplevel = Toplevel()
        toplevel.geometry('400x570')
        toplevel.title('Gestion CDI - Actions')
        toplevel.iconbitmap('Images/iconeApp.ico') #Work in Visual Studio Code | NOT WORK IN PYZO
        bouton2 = Button(toplevel, width=20, height=2, text='Ajouter Ouvrages', font=("Comic Sans MS", 12), command=Aouvrages)
        bouton2.pack(padx=5, pady=5)
        bouton3 = Button(toplevel, width=20, height=2, text='Modifier Ouvrages', font=("Comic Sans MS", 12), command=MouvragesRech)
        bouton3.pack(padx=5, pady=5)
        bouton4 = Button(toplevel, width=20, height=2, text='Supprimer Ouvrages', font=("Comic Sans MS", 12), command=SouvragesRech)
        bouton4.pack(padx=5, pady=5)
        label = Label(toplevel, text = "---", font=("Comic Sans MS", 15))
        label.pack()
        bouton5 = Button(toplevel, width=20, height=2, text='Ajouter Abonnés', font=("Comic Sans MS", 12), command=Aabonnes)
        bouton5.pack(padx=5, pady=5)
        bouton6 = Button(toplevel, width=20, height=2, text='Modifier Abonnés', font=("Comic Sans MS", 12), command=Aabonnes)
        bouton6.pack(padx=5, pady=5)
        bouton7 = Button(toplevel, width=20, height=2, text='Supprimer Abonnés', font=("Comic Sans MS", 12), command=Aabonnes)
        bouton7.pack(padx=5, pady=5)
        label = Label(toplevel, text = "---", font=("Comic Sans MS", 15))
        label.pack()
        bouton = Button(toplevel, width=20, height=2, text='Revenir au menu', font=("Comic Sans MS", 12), command=quitter2)
        bouton.pack(side=BOTTOM, padx=5, pady=5)
    
    ## Fenetre Prêts
    def prets():
        def quitter3():
            toplevel.destroy()
            fenetre.deiconify()
    
        toplevel = Toplevel()
        toplevel.geometry('400x800') # 400x710
        toplevel.title('Gestion CDI - Prêts')
        toplevel.iconbitmap('Images/iconeApp.ico') #Work in Visual Studio Code | NOT WORK IN PYZO
    
        label = Label(toplevel, text = "---")
        label.pack()
    
        bouton = Button(toplevel, width=20, height=2, text='Revenir au menu', command=quitter3)
        bouton.pack(side=BOTTOM, padx=5, pady=5)
    
    ## Fenetre Recherche
    def recherche():
        def quitter4():
            toplevel.destroy()
            fenetre.deiconify()
    
        toplevel = Toplevel()
        toplevel.geometry('400x400')
        toplevel.title('Gestion CDI - Recherche')
        toplevel.iconbitmap('Images/iconeApp.ico') #Work in Visual Studio Code | NOT WORK IN PYZO
    
        label = Label(toplevel, text = "Que recherchez-vous ?", bg="yellow", font=("Arial", 15))
        label.pack()
    
        label = Label(toplevel, text = "\n\nRecherche par TITRE")
        label.pack()
        entreeRechT = Entry(toplevel, textvariable=str, width=30)
        entreeRechT.pack()
        bouton = Button(toplevel, text='Rechercher', command=quitter4)
        bouton.pack()
    
        label = Label(toplevel, text = "\nRecherche par ANNÉE")
        label.pack()
        entreeRechAn = Entry(toplevel, textvariable=int, width=30)
        entreeRechAn.pack()
        bouton = Button(toplevel, text='Rechercher', command=quitter4)
        bouton.pack()
    
        label = Label(toplevel, text = "\nRecherche par AUTEUR")
        label.pack()
        entreeRechAu = Entry(toplevel, textvariable=str, width=30)
        entreeRechAu.pack()
        bouton = Button(toplevel, text='Rechercher', command=quitter4)
        bouton.pack()
    
        bouton = Button(toplevel, width=20, height=2, text='Revenir au menu', command=quitter4)
        bouton.pack(side=BOTTOM, padx=5, pady=5)
    
    ## Fenetre Statistiques
    def stats():
        def quitter5():
            toplevel.destroy()
            fenetre.deiconify()
    
        toplevel = Toplevel()
        toplevel.geometry('400x400')
        toplevel.title('Gestion CDI - Statistiques')
        toplevel.iconbitmap('Images/iconeApp.ico') #Work in Visual Studio Code | NOT WORK IN PYZO
        label = Label(toplevel, text = "Statistiques")
        label.pack()
        bouton = Button(toplevel, width=20, height=2, text='Revenir au menu', command=quitter5)
        bouton.pack(side=BOTTOM, padx=5, pady=5)
    
    ## Fenetre Ajouter, Modifier ou Supprimer > Ajouter Ouvrages
    def Aouvrages():
        def quitter6():
            toplevel.destroy()
            fenetre.deiconify()
    
        toplevel = Toplevel()
        toplevel.geometry('400x300')
        toplevel.title('Gestion CDI - Ajouter Ouvrages')
        toplevel.iconbitmap('Images/iconeApp.ico') #Work in Visual Studio Code | NOT WORK IN PYZO
    
        label = Label(toplevel, text = "\nTITRE")
        label.pack()
        entreeOtitre = Entry(toplevel, textvariable=str, width=30)
        entreeOtitre.pack()
    
        label = Label(toplevel, text = "\nANNÉE")
        label.pack()
        entreeOannee = Entry(toplevel, textvariable=int, width=30)
        entreeOannee.pack()
    
        label = Label(toplevel, text = "\nAUTEUR")
        label.pack()
        entreeOauteur = Entry(toplevel, textvariable=int, width=30)
        entreeOauteur.pack()
    
        label = Label(toplevel, text = "\n---\n")
        label.pack()
        bouton = Button(toplevel, text='Valider', command=quitter6)
        bouton.pack()
    
        bouton = Button(toplevel, width=20, height=2, text='Revenir au menu', command=quitter6)
        bouton.pack(side=BOTTOM, padx=5, pady=5)
    
    ## Fenetre Ajouter, Modifier ou Supprimer > Modifier Ouvrages
    def MouvragesRech():
        def quitter9():
            toplevel.destroy()
            fenetre.deiconify()
    
        toplevel = Toplevel()
        toplevel.geometry('400x400')
        toplevel.title('Gestion CDI - Modifier Ouvrages')
        toplevel.iconbitmap('Images/iconeApp.ico') #Work in Visual Studio Code | NOT WORK IN PYZO
    
        label = Label(toplevel, text = "Quel ouvrage voulez-vous modifier ?", bg="yellow", font=("Arial", 15))
        label.pack()
    
        # Création d'un dictionnaire avec pour clé le nom du bouton et pour valeurs le nom du livre
        titre_dict = {}
        compteur = 0
        for nb in range(len(LtitresOuvrages)):
            titre_dict["Bouton%s" %nb] = LtitresOuvrages[compteur]
            compteur += 1
        print(titre_dict)
    
        # Création d'un bouton pour chaque values du dictionnaire
        for elt in titre_dict.values():
            Button(toplevel, text=f"{elt}", borderwidth=1, command = lambda: Mouvrages(elt)).pack()
    
    
        label = Label(toplevel, text = "\n---\n")
        label.pack()
    
        bouton = Button(toplevel, width=20, height=2, text='Revenir au menu', command=quitter9)
        bouton.pack(side=BOTTOM, padx=5, pady=5)
    
    def Mouvrages(elt): ## Fenetre Ajouter, Modifier ou Supprimer > Modifier Ouvrages > Modifier Ouvrages 'selection'
        def quitter8():
            toplevel.destroy()
            fenetre.deiconify()
    
        toplevel = Toplevel()
        toplevel.geometry('400x300')
        toplevel.title('Gestion CDI - Modifier Ouvrages')
        toplevel.iconbitmap('Images/iconeApp.ico') #Work in Visual Studio Code | NOT WORK IN PYZO
    
        label = Label(toplevel, text = "\nNouveau TITRE")
        label.pack()
        entreeNewTitre = Entry(toplevel, textvariable=str, width=30)
        entreeNewTitre.pack()
    
        label = Label(toplevel, text = "\nNouvelle ANNÉE")
        label.pack()
        entreeNewAnnee = Entry(toplevel, textvariable=int, width=30)
        entreeNewAnnee.pack()
    
        label = Label(toplevel, text = "\nNouvel AUTEUR")
        label.pack()
        entreeNewAuteur = Entry(toplevel, textvariable=int, width=30)
        entreeNewAuteur.pack()
    
        label = Label(toplevel, text = "\n---\n")
        label.pack()
        bouton = Button(toplevel, text='Valider', command=quitter8)
        bouton.pack()
    
        bouton = Button(toplevel, width=20, height=2, text='Revenir au menu', command=quitter8)
        bouton.pack(side=BOTTOM, padx=5, pady=5)
    
    ## Fenetre Ajouter, Modifier ou Supprimer > Supprimer Ouvrages
    def SouvragesRech():
        def quitter10():
            toplevel.destroy()
            fenetre.deiconify()
    
        toplevel = Toplevel()
        toplevel.geometry('400x400')
        toplevel.title('Gestion CDI - Supprimer Ouvrages')
        toplevel.iconbitmap('Images/iconeApp.ico') #Work in Visual Studio Code | NOT WORK IN PYZO
    
        label = Label(toplevel, text = "Quel ouvrage voulez-vous supprimer ?", bg="yellow", font=("Arial", 15))
        label.pack()
    
        LtitresOuvrages = ["La Conjuration des imbéciles", "Le Horla",  "Marelle", "L'Appel de la forêt", "Fahrenheit 451"]
    
        ##
    
        label = Label(toplevel, text = "\n---\n")
        label.pack()
    
        bouton = Button(toplevel, width=20, height=2, text='Revenir au menu', command=quitter10)
        bouton.pack(side=BOTTOM, padx=5, pady=5)
    
    ## Fenetre Ajouter, Modifier ou Supprimer > Ajouter Abonnés
    def Aabonnes():
        def quitter7():
            toplevel.destroy()
            fenetre.deiconify()
    
        toplevel = Toplevel()
        toplevel.geometry('400x380')
        toplevel.title('Gestion CDI - Ajouter Abonnés')
        toplevel.iconbitmap('Images/iconeApp.ico') #Work in Visual Studio Code | NOT WORK IN PYZO
    
        label = Label(toplevel, text = "\nNOM")
        label.pack()
        entreeOtitre = Entry(toplevel, textvariable=str, width=30)
        entreeOtitre.pack()
    
        label = Label(toplevel, text = "\nPRENOM")
        label.pack()
        entreeOannee = Entry(toplevel, textvariable=str, width=30)
        entreeOannee.pack()
    
        label = Label(toplevel, text = "\nCLASSE")
        label.pack()
        entreeOauteur = Entry(toplevel, textvariable=int, width=30)
        entreeOauteur.pack()
    
        label = Label(toplevel, text = "\nSTATUT")
        label.pack()
        value = StringVar()
        boutonStatutL = Radiobutton(toplevel, text="Lycéen", variable=value, value=1)
        boutonStatutE = Radiobutton(toplevel, text="Enseignant", variable=value, value=2)
        boutonStatutL.pack()
        boutonStatutE.pack()
    
        label = Label(toplevel, text = "\n---\n")
        label.pack()
        bouton = Button(toplevel, text='Valider', command=quitter7)
        bouton.pack()
    
        bouton = Button(toplevel, width=20, height=2, text='Revenir au menu', command=quitter7)
        bouton.pack(side=BOTTOM, padx=5, pady=5)
    
    ## Fenetre Ajouter, Modifier ou Supprimer > Modifier Abonnés
        ##
    
    ## Fenetre Ajouter, Modifier ou Supprimer > Supprimer Abonnés
        ##
    
    ## Accueil
    fenetre = Tk()
    fenetre.geometry('500x450')
    fenetre.title('Gestion CDI')
    fenetre.iconbitmap('Images/iconeApp.ico') #Work in Visual Studio Code | NOT WORK IN PYZO
    
    label = Label(fenetre, text = "Bienvenue dans l'interface de gestion de votre CDI.\n\nQue souhaitez-vous faire ?\n\n", font=("Arial", 15))
    label.pack()
    
    boutonAMS = Button(fenetre, width=30, height=2, text='Ajouter, Modifier ou Supprimer', font=("Comic Sans MS", 12), command=AMS)
    boutonAMS.pack()
    boutonResa = Button(fenetre, width=20, height=2, text='Prêts', font=("Comic Sans MS", 12), command=prets)
    boutonResa.pack()
    boutonRech = Button(fenetre, width=20, height=2, text='Recherche', font=("Comic Sans MS", 12), command=recherche)
    boutonRech.pack()
    boutonStats = Button(fenetre, width=20, height=2, text='Statistiques', font=("Comic Sans MS", 12), command=stats)
    boutonStats.pack()
    
    label = Label(fenetre, text = "-- Application réalisée dans le cadre d'un mini-projet en NSI --", font=("Courier", 9))
    label.pack(side=BOTTOM)
    
    fenetre.mainloop()
    print("Programme terminé !")
    
    
    ## BLOC-NOTES 
        #   def getEntry():
        #     res = entreeRechO.get()
        #     print(res)
        #     if res in liste:
        #         Mouvrages()
        #     else:
        #         showerror('Erreur', 'Impossible de trouver le livre')

    Je vous serais très reconnaissant de m'aider. Merci
    Cordialement, 

    Benjamin

    -
    Edité par TheAlistair's 16 octobre 2021 à 22:13:50

    • Partager sur Facebook
    • Partager sur Twitter
      16 octobre 2021 à 23:03:34

      Essayez de vous inspirer de ces quelques lignes:

      import tkinter as tk
      
      root = tk.Tk()
      
      def display(key):
          print(key, dico[key])
      
      dico = {}
      
      for i in range(5):
          key = f'Button {i}'
          dico[key] = f'le titre {i}'
          tk.Button(root, text=f'B{i}', command=lambda k=key: display(k)).pack()
      
      tk.mainloop()
      



      • Partager sur Facebook
      • Partager sur Twitter
        17 octobre 2021 à 9:17:35

        mps a écrit:

        Essayez de vous inspirer de ces quelques lignes:

        import tkinter as tk
        
        root = tk.Tk()
        
        def display(key):
            print(key, dico[key])
        
        dico = {}
        
        for i in range(5):
            key = f'Button {i}'
            dico[key] = f'le titre {i}'
            tk.Button(root, text=f'B{i}', command=lambda k=key: display(k)).pack()
        
        tk.mainloop()

        Merci beaucoup ! 



        -
        Edité par TheAlistair's 17 octobre 2021 à 9:18:57

        • Partager sur Facebook
        • Partager sur Twitter
          17 octobre 2021 à 20:34:59

          TheAlistair's a écrit:

          Merci beaucoup !

          Bonjour,

          Sujet résolu

          Tu peux passer le sujet à "résolu" (bouton en haut à droite du sujet) et cliquer sur les pouces levés des messages qui t'ont aidé⋅e ;)

          • Partager sur Facebook
          • Partager sur Twitter

          Blocage Python + Tkinter

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown