thombou
Messages postés195Date d'inscriptionmercredi 19 mai 2010StatutMembreDernière intervention12 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.
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.