8
votes

Python: Supprimer un cadre Tkinter

Je veux retirer un cadre de mon interface lorsqu'un bouton spécifique est cliqué.

Ceci est la fonction de rappel invoqué p> xxx pré>

Cependant, il ne supprime pas lui-même. Je suis probablement simplement supprimer l'objet dans Python sans mettre à jour l'interface? P>

Merci P>

Mise à jour p>

AttributeError: Frame instance has no attribute 'Destroy'


2 commentaires

Del Self Il suffit de supprime le nom auto de la portée locale.


Les bases de l'indentation que vous avez montrées apparaissent, vous avez écrit une méthode sous forme de sous-méthode à la méthode init . Self.ItemFrame et remodelez les deux doivent être indompensés et non au même niveau que la méthode en dessous. Cela pourrait expliquer pourquoi vous ne pouvez pas détruire le cadre.


4 Réponses :


0
votes

WONT Cette aide: self.destroy ()

chk cette sortie: PY Cookbook Le dernier para


1 commentaires

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



2
votes

del ne supprime rien. del quelque chose est simplement supprime quelque chose de la portée locale. Et bien que si quelque chose était la seule référence à un objet, il peut permettre à l'objet de prendre des ordures recueillies à l'avenir, ne pensez même pas à utiliser del pour supprimer des objets !!! Et étant donné que auto est juste une variables normales, self ne fait rien, sauf bien céder le reste de la méthode d'accéder à l'instance (donc à la fin de la méthode, C'est en fait comme passe ).

Le moyen exact de supprimer un widget de l'interface graphique dépend de quel gestionnaire de géométrie utilisez-vous. Si vous avez utilisé .grid () , vous pouvez utiliser .grid_forget () . Notez que cela ne détruit toujours pas le widget - tout à fait contraire, vous pouvez continuer et .grid () . - Mais cela ne fait aucune différence.


3 commentaires

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


@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 (certains, options) afin d'afficher le widget?


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



21
votes

Pour supprimer, appelez soit frm.pack_forget () ou frm.grid_forget () selon que le cadre a été emballé ou grisé.

Appelez ensuite frm.destroy () Si vous n'allez pas l'utiliser à nouveau, ou retenez-vous sur la référence, de vous reposer ou de se retrouver lorsque vous souhaitez le montrer à nouveau.


3 commentaires

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


détruire est tous minuscules. Le message d'erreur indique que vous avez utilisé majuscule.


Steven Rumbalski J'ai la même erreur avec des minuscules "Destroy ()". En fait, le code travaille avec Just Pack_Forget. Mais j'ai besoin de détruire pour nettoyer la mémoire que je suppose ..



1
votes

Disons que vous faites une classe. Vous devez faire quelques choses spéciales ici:

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

    Donc, voici comment un prototype de base regarderait. P>

    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()
    


4 commentaires

C'est exactement ce que j'ai, mais je reçois toujours l'erreur "La trame n'a pas d'attribuer la destruction ()". J'ai mis à jour ma question avec le code


Et vous mettez toute l'interface graphique dans une classe? En outre, quelle version de Python utilisez-vous?


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


C'est étrange. Ce script court pour moi à Python 2.7. Je ne sais pas ce qui se passe à votre fin.