[TkInter] Vider éléments d'une Frame

Fermé
thombou Messages postés 195 Date d'inscription mercredi 19 mai 2010 Statut Membre Dernière intervention 12 avril 2018 - Modifié le 13 avril 2017 à 10:38
 gudu - 19 avril 2017 à 18:58
Bonjour,

Je suis actuellement en train de coder une petite interface qui affiche le graph des données reçues par une carte d'acquisition. Le but est d'afficher les données quand on y est connectés et d'afficher un petit texte lorsque l'on se déconnecte. J'arrive à afficher le graph avec MatPlotLib, mais lorsque je me déconnecte je n'arrive pas à vider la Frame qui contient le graph... En fait je ne cherche pas nécessairement vider la Frame mais trouver un moyen pour remplacer le contenu de la classe Contenu, par le texte invitant à se connecter.

Voici mon code :
class Interface(Frame):
    """Fenêtre principale, on y organise toute la fenetre principale, sans la connexion qui va se faire dans une autre fenêtre"""
 
    def __init__(self, fenetre, **kwargs):
        Frame.__init__(self, fenetre, **kwargs)
        self.pack(fill=BOTH, expand=True, padx=5, pady=5)
        self.parent = fenetre     
        self.parent.title("Lidar - PIMS") 
        
# Zone de connexion        
        
        self.frameConnexion= LabelFrame(self, text="Connexion")
        self.frameConnexion.pack(fill=X)
        
        self.texteBienvenue = Label(self.frameConnexion, text="Device IP adress: ")
        self.Ip1 = StringVar()
        self.bIp = Entry(self.frameConnexion, textvariable=self.Ip1, width=20)
        self.boutonConnexion = Button(self.frameConnexion, text="Connect", fg="green", command=self.Connexion)
        self.connexionState = Label(self.frameConnexion, text="Current state : Disconnected")        
        
        self.texteBienvenue.pack(side=LEFT, padx=5, pady=5)
        self.bIp.pack(side=LEFT)
        self.boutonConnexion.pack(side=LEFT, padx=5,pady=5)
        self.connexionState.pack(side=RIGHT, padx=5, pady=5)
       
        self.connected = False

# Zone du contenu

        self.frameContenu = Frame(self, borderwidth=1, relief=RAISED, width=600, height=600) # C'est cette Frame que je veux vider par la suite.
        self.frameContenu.pack(expand=True, fill=BOTH)
        self.messageContenuNonConnecte = Label(self.frameContenu, text="Please connect the device to have the spectrum")
        self.messageContenuNonConnecte.pack(padx=5, pady=5)

# Zone du bas, pour quitter        
        
        self.quitter = Button(self,text="Close", command=self.Fermer)
        self.quitter.pack(side="right", padx=5, pady=5)
        
    def Fermer(self):
        self.quit()
        self.parent.destroy()

 
    def Connexion(self):
        """Gère la connexion et la déconnexion à la RedPitaya(RP). C'est ici que sont définies les instances
        self.connected, self.driver et self.client"""
        self.ip = self.bIp.get()
        if self.connected == False: #On se connecte
            if re.search(r"^[0-9]{1,3}(.[0-9]{1,3}){3}$",self.ip) is None:
                print("test2")
                messagebox.showwarning("Connexion", "An error has occured because the IP adress syntax isn't correct")
                
            else:
                
                ### Connexion ###
                #self.client = connect(self.Ip, name='spectrum')
                #self.driver = Spectrum(self.client) 
                
             
                self.boutonConnexion.config(text="Disconnect",fg="red")
                self.connexionState["text"]="Current state : connected to {}".format(self.ip)
                self.connected = True
        else: #on se déconnecte
        
            self.connexionState["text"]="Current state : disconnected"
            self.connected=False
            self.boutonConnexion.config(text="Connect",fg="green")
        
        self.UpdateContenuConnexion() # On met à jour le contenu de la fenêtre
        
    def UpdateContenuConnexion(self):
        """Mise à jour du contenu lors d'une connexion ou déconnexion"""
        
        if self.connected == True:
            
            self.messageContenuNonConnecte.pack_forget()
            self.graphique = Contenu(self.driver, self.frameContenu)
            self.graphique.TraceSpectrum([1, 2, 3, 4, 5], [12, 43, 59, 20, 2])
            
            
        else: #Partie pour la déconnexion
            del self.graphique  ## C'est ICI ## 
            self.frameContenu.update()
            self.messageContenuNonConnecte.pack(padx=5, pady=5)


Voici par la même occasion le code de la classe Contenu :

class Contenu(Frame):
    def __init__(self, driver, frame):
        self.driver= driver
        self.frame = frame
        
        self.InitFrames() # Une fonction que je n'ai pas mise ici car elle ne fait que définir des frames, dont celle nommée frameSpectrum.


    def TraceSpectrum(self, x, spectrum):
        """Trace le spectre dans le widget défini lors de l'appel de la fonction (frame)"""
        
        self.f = Figure(figsize=(5,5), dpi=100)
        self.graph = self.f.add_subplot(111)
        self.graph.plot(x, spectrum)
        
        self.canvas = FigureCanvasTkAgg(self.f, self.frameSpectre)
        self.canvas.show()
        self.canvas.get_tk_widget().pack(side=BOTTOM, fill=BOTH, expand=True)

        toolbar = NavigationToolbar2TkAgg(self.canvas, self.frameSpectre)
        toolbar.update()
        self.canvas._tkcanvas.pack(side=TOP, fill=BOTH, expand=True)




L'informatique est un monde dont on a jamais fini de faire le tour.
A voir également:

1 réponse

Si tu veux vider une frame, tu peux utiliser la méthode winfo_children() pour récupérer la liste des widgets qui sont dans cette frame, et sur chaque éléments de cette liste appliquer la méthode destroy pour la vider de tous les widgets contenus.
0