2010-10-18 22 views
3

Je souhaite supprimer une image de mon interface lorsqu'un utilisateur clique sur un bouton spécifique.Python: suppression d'une trame TKinter

C'est la fonction de rappel invoquée

def removeMyself(self): 
    del self 

Cependant, il ne se retire pas. Je supprime probablement l'objet en python sans mettre à jour l'interface?

grâce

Mise à jour

self.itemFrame = tk.Frame(parent) 
self.itemFrame.pack(expand=False, side=tk.TOP) 

removeB = tk.Button(self.itemFrame, text="Remove", width=10, command=self.removeIsosurface) 

def removeIsosurface(self): 
    self.itemFrame.Destroy() 

Message d'erreur:

AttributeError: Frame instance has no attribute 'Destroy' 
+2

'destroy()' est en minuscules. –

+0

'del self' supprime simplement le nom' self' de la portée locale. –

Répondre

11

Pour supprimer, appelez frm.pack_forget() ou frm.grid_forget() selon que la trame a été compressée ou empaquetée.

Ensuite, appelez frm.destroy() si vous ne comptez plus l'utiliser, ou maintenez sur la référence et remballez ou réglez lorsque vous souhaitez l'afficher à nouveau.

+0

Enfin, pack_forget le fait disparaître! J'ai toujours un problème avec la méthode destroy. Je reçois le message d'erreur que vous voyez dans la question – aneuryzm

+0

'détruire' est tout en minuscules. Le message d'erreur indique que vous avez utilisé des majuscules. –

+0

Steven Rumbalski J'ai eu la même erreur en minuscules "destroy()". En fait, le code fonctionne avec pack_forget. Mais je dois détruire pour nettoyer la mémoire je suppose .. – aneuryzm

0

wont cette aide: self.destroy()

chk ceci: PY cookbook le dernier paragraphe

+0

mon widget est un cadre, il dit qu'il n'a aucun attribut détruire – aneuryzm

3

del ne supprime rien.del something supprime simplement something de la portée locale. Et bien que si something était la seule référence à un objet, peut permettre à l'objet d'être garbage collecté dans le futur, ne pense même pas à utiliser del pour supprimer des objets !!! Et puisque self est juste une variable normale, del self ne fait rien, sauf bien sûr arrêter le reste de la méthode d'accéder à l'instance (donc à la fin de la méthode, c'est en fait pass).

La manière exacte de supprimer un widget de l'interface graphique dépend du gestionnaire de géométrie que vous utilisez. Si vous avez utilisé .grid(), vous pouvez utiliser .grid_forget(). Notez que cela ne détruit toujours pas le widget - bien au contraire, vous pouvez continuer et .grid() encore! - mais cela ne fait aucune différence.

+0

ok merci, mais je n'ai pas utilisé la grille. Mon widget est un cadre. Comment puis-je supprimer des images? – aneuryzm

+0

@Patrick: Je sais que vous utilisez un cadre - je parle du gestionnaire de géométrie. C'est à dire. avez-vous appelé 'the_frame.grid (some, options)' pour afficher le widget? – delnan

+0

Non, encore une fois, je n'ai pas appelé la grille. J'ai ajouté le code à ma question – aneuryzm

0

Disons que vous faites un cours. Vous devez faire quelques choses spéciales ici:

  • Le cadre que vous voulez détruire doit être une variable d'instance
  • Vous devez écrire un rappel (que vous avez fait)

Alors , voici à quoi ressemblerait un prototype de base.

from Tkinter import Tk, Frame, Button, Label 

class GUI: 

    def __init__(self, root): 
     self.root = root # root is a passed Tk object 
     self.button = Button(self.root, text="Push me", command=self.removethis) 
     self.button.pack() 
     self.frame = Frame(self.root) 
     self.frame.pack() 
     self.label = Label(self.frame, text="I'll be destroyed soon!") 
     self.label.pack() 

    def removethis(self): 
     self.frame.destroy() 

root = Tk() 
window = GUI(root) 
root.mainloop() 

Bonne chasse!

+0

C'est exactement ce que j'ai, mais je reçois toujours l'erreur "frame has not attribute Destroy()". J'ai mis à jour ma question avec le code – aneuryzm

+0

Et vous avez mis toute l'interface graphique dans une classe? Aussi, quelle version de Python utilisez-vous? –

+0

Oui, c'est dans une classe. J'utilise Python 2.6.1 – aneuryzm

Questions connexes