Partage
  • Partager sur Facebook
  • Partager sur Twitter

Communication entre module

    22 novembre 2021 à 18:21:16

    Bonjour, grand débutant avec python, je n'arrive pas à résoudre mon problème.

    Dans mon module main, ci joint, j'affiche un treeview alimenté par une bdd sqlite3.

    Ce treeview est une instance d'une classe créée dans un module AffTreeview. Jusque la, ça fonctionne.

    import tkinter as tk
    from tkinter import ttk
    
    from AffTreeview import MyTreeview
    import Archives
    import Autrefenetre
    import Nouvelleconsigne
    import Bdd
    
    if __name__ == "__main__":
        inter = 0  # Init Bascule du sens de tri
    
    
        def open_encours():
            window_ec = Archives.Window(app)
            window_ec.grab_set()
    
    
        def open_autres():
            window_a = Autrefenetre.Window2(app)
            window_a.grab_set()
    
    
        def open_nouvelle():
            window_n = Nouvelleconsigne.NewCons(app)
            window_n.grab_set()
    
    
        color = '#c1c1c3'
    
        app = tk.Tk()
        hght = app.winfo_screenheight()
        wdth = app.winfo_screenwidth()
        app.geometry(str(wdth - 300) + "x" + str(hght - 100))
        app.title('Fenetre Accueil')
        app.configure(bg=color)
    
        frtitre = tk.Frame(app)
        frtitre.grid(row=0, column=0, columnspan=10, padx=5, pady=10, sticky="ew")
        lbltitre = tk.Label(frtitre, text="Consigne en cours", font=30)
        lbltitre.grid(sticky="ew")
    
        frbout = tk.Frame(app, bg=color)
        frbout.grid(row=1, column=0, rowspan=7, columnspan=1, padx=5, pady=10, sticky="ns")
        b1 = ttk.Button(frbout, text='Archives', command=open_encours)
        b1.grid(row=0, column=0, columnspan=1, padx=5, pady=10, sticky="ew")
        b2 = ttk.Button(frbout, text='Nouvelle Consigne', command=open_nouvelle)
        b2.grid(row=2, column=0, columnspan=1, padx=5, pady=10, sticky="ew")
        b3 = ttk.Button(frbout, text='Autres', command=open_autres)
        b3.grid(row=4, column=0, columnspan=1, padx=5, pady=10, sticky="ew")
    
        mytree = MyTreeview(app, 1, 1, 6, 1)
        Bdd.Affichage(mytree.c_tree, 1)
        app.mainloop()
    

    J'ai aussi un module Nouvelleconsigne où j’insère dans la bdd des nouvelles valeurs. La aussi ça fonctionne.

    Par contre, je n'arrive pas a mettre a jour instantanément le treeview dans Main via Main.Mytreeview.Affichage()

    Message d'erreur "Main n'a pas d’attribut Mytree "  : module 'Main' has no attribute 'mytree'

    Ma question est donc : Comment je peux faire pour mettre à jour Mytreeview directement? Quand je relance le prog les nouvelles valeurs sont bien prises en compte.

    Voici un extrait de Nouvelleconsigne :

    class NewCons(tk.Toplevel):
        def __init__(self, parent):
    
            super().__init__(parent)
    
            bgcolor = '#c1c1c3'
    
            self.geometry("800x600")
            self.title('Nouvelle consigne')
            self.columnconfigure(1, weight=1)
            self.rowconfigure(5, weight=1)
    
            def effacer_champs():
                e_date.delete(0, tk.END)
                e_objet.delete(0, tk.END)
                e_objet2.delete(0, tk.END)
                e_type.delete(0, tk.END)
                e_consigne.delete(0, tk.END)
                e_action.delete(0, tk.END)
                e_soff.delete(0, tk.END)
                e_cloture.delete(0, tk.END)
                var.set(0)
    
            def ajouter():
                ajtdate = e_date.get()
                ajtobjet = e_objet.get()
                ajtobjet2 = e_objet2.get()
                ajttype = e_type.get()
                ajtconsigne = e_consigne.get()
                ajtaction = e_action.get()
                ajtsoff = e_soff.get()
    
                if var.get() == 1:
                    ajtcloture = e_cloture.get()
                else:
                    ajtcloture = "None"
    
                liste_entry = (ajtdate, ajtobjet, ajtobjet2, ajttype, ajtconsigne, ajtaction, ajtsoff, ajtcloture)
                Bdd.AjoutDsBdd(" TConsignes", liste_entry)
                effacer_champs()
                Bdd.Affichage(Main.mytree.c_tree, 1)

    En esperant être assez clair.

    Merci

    • Partager sur Facebook
    • Partager sur Twitter
      22 novembre 2021 à 18:53:19

      Je pense que l'affichage devrait se faire après l'appel à NewCons du main et non pas dans cette fonction (on différencie les données de l'affichage)

      Donc après la ligne 25, refaire un affichage avec Bdd.affichage(mytree.c_tree,1)

      • Partager sur Facebook
      • Partager sur Twitter
        22 novembre 2021 à 20:57:04

        Tout ce qui est sous la condition __name__ == '__main__' n'existe que dans le script principal.

        Et il n'est pas très recommandé de faire des imports circulaires.

        Pour mettre à jour le treeview vous pouvez passer le widget à la création NewCons(app, mytree).

        Comme NewCons semble être une fenêtre de dialogue, l'appelant devrait attendre que le dialogue soit terminé (avec wait_window) et récupérer les données à afficher.

        Il y a plein de solutions, mais il faut maîtriser un peu tkinter sans parler de la POO dont vous n'avez pas vraiment besoin ici. Regardez comment vous avez écrit NewCons: quel est l'intérêt d'une classe si c'est pour tout coller dans l'__init__? Une fonction aurait suffit. Le wait_window (placé côté appelé cette fois) attend que la fenêtre se ferme et la fonction retourne ce qu'on veut à l'appelant.

        • Partager sur Facebook
        • Partager sur Twitter
          22 novembre 2021 à 22:02:29

          Merci pour vos réponses.

          J'ai remplacé la class Newcons par une fonction avec comme paramètre le treeview et miracle cela fonctionne.

          Je n'importe rien de Main directement et j'appelle la toplevel avec :

          def open_nouvelle():
          window_n = Nouvelleconsigne.newcons(mytree)
          • Partager sur Facebook
          • Partager sur Twitter

          Communication entre module

          × 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