IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tkinter Python Discussion :

[Tkinter] Comment effacer le contenu d'une frame?


Sujet :

Tkinter Python

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 8
    Points : 7
    Points
    7
    Par défaut [Tkinter] Comment effacer le contenu d'une frame?
    Salut,
    Comme le titre le dit, je souhaiterais effacer le contenu d'une frame pour pouvoir modifier son contenu. Je ne souhaite pas la supprimer pour en creer une nouvelle.

    En fait, j'ai dans une frame une serie de checkbutton, et le fait de cliquer sur l'un d'entre eux va afficher dans une autre frame (celle dont je souhaite effacer le contenu) une nouvelle serie de checkbutton. Chaque checkbutton de la premiere frame affichera une liste differente de checkbutton.

    Mais je n'arrive pas a effacer le contenu de la 2eme frame a chaque fois.
    Quelqu'un peut il m'aider.
    Merci d'avance

  2. #2
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2006
    Messages : 80
    Points : 74
    Points
    74
    Par défaut
    Tu ne dois pas effacer un Frame. Ce que tu dois faire, c'est mettre un canvas dans ton frame.


    dans le canevas que tu a initialisé, tu dois definir une fonction qui sera activée par une command (bouton, clic...)

    voici l'opération:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def effacer(self): 
          """Ca effacera tout ce qu'il y a dans le canevas""" 
          self.canevas.delete(ALL)
    canevas étant le nom que tu as donné a ton Canvas

  3. #3
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2006
    Messages : 80
    Points : 74
    Points
    74
    Par défaut
    Je sais que je ne dois pas faire de double post. Déso.

    Analyse ce code, tu verra les frames et canvas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    # -*- coding : cp1252 -*- 
    from Tkinter import* 
    '''ce tuto n'est pas facile mais très intéressant...''' 
    class BarreDesMenus(Frame): 
       """C'est la barre des menus, dans cette classe on définira ce qu'il ya dedans""" 
     
       #Initialisation de la class : 
       def __init__(self, boss = None): #boss représente une fenetre maitre, soi = le nom des objets de la classe 
     
          Frame.__init__(self, borderwidth = 2) #taille du bord de la frame = fenetre 
          #Donc c'est une bande, avec deux pixels d'écart des bords (autres) 
          #une frame ressemble à Tk avec d'autres propriétés 
     
          #Bon on fait un menu <Menu 1> : 
          BoutonMenu1 = Menubutton(self, text = "<Menu 1>") 
          #Menubutton est un type de bouton. Quand on clique dessus, on pourrait avoir un menu 
          BoutonMenu1.pack(side = LEFT) #la méthode pack permet des "endroits" de position.. 
     
          #On définit ce qu'il y a dans le menu 1 
          menu1 = Menu(BoutonMenu1) #on dit que c'est un menu sortant de tel bouton 
          menu1.add_command(label = "Commande1", command = boss.commande1) 
          #boss est le "maitre" (fenetre maitresse), vous verrez plus loin dans le code les instructions viennent d'elles 
          menu1.add_command(label = "Commande 2", command = boss.commande2) 
          BoutonMenu1.configure(menu = menu1) #on dit que le bouton doit dérouler ce menu 
     
          #On fait un menu <Menu 2> 
          BoutonMenu2 = Menubutton(self, text = "<Menu 2>") 
          #on définit ce qu'il y a dans le menu 2 
          menu2 = Menu(BoutonMenu2) 
          menu2.add_command(label = "Effacer tout", command = boss.effacer) 
          menu2.add_separator() #ben une ligne qui sépare les deux et on va dans l'ordre.... 
          menu2.add_command(label = "Quitter", command = boss.quit) 
          #boss.quit signifie qu'on quitte la fenetre maitresse (donc on quitte tout vu que la fenetre maitresse contient tout) 
          BoutonMenu2.configure(menu = menu2) 
          BoutonMenu2.pack(side = LEFT, padx = '5') 
          #On fait tout ca dans l'ordre, vu que le premier vient d'etre définit, le prog met le bouton a coté 
          #mais il va coller l'autre bouton donc il faut un écart horizontal ==> padx = '5' pixels 
    def cercle(canevas, x, y, r):  #cette fonction n'est pas dans une classe.... 
       """dessin d'un cercle de rayon <r> en <x,y> dans le canevas <can>""" 
       canevas.create_oval(x-r, y-r, x+r, y+r) #une création d'un bo cercle 
     
    class Application(Frame): 
       """ Application principale """ 
       def __init__ (self, boss = None): 
          Frame.__init__(self) 
          self.master.title("Un tuto sur les menus") #c'est l'objet maitre (master) 
     
          BarreMenus = BarreDesMenus(self) #objet qui dépend de notre première classe 
          BarreMenus.pack() #ca veut dire qu'on la crée, on la fait apparaitre 
     
          #on crée un canevas dans lequel on pourra travailler (graphiquement, on pourrait faire un truc sans canevas) 
          self.canevas = Canvas(self, bg = 'light grey', height = 300, 
                              width = 300, borderwidth = 2) 
          self.canevas.pack() 
          self.pack() 
     
          #Définition des 3 commandes citées plus haut dans la classe "BarreDesMenus" 
       def commande1(self): 
          self.canevas.create_rectangle(80, 100, 180, 200, fill = "red") #c'est plutot un carré 
          #Pour dessiner un rectangle il faut donner les coord du point en haut à gauche et du point en bas à droite 
          #noublions pas, les x augmentent vers la droite ET LES Y AUGMENTENT VERS LE BAS (en python) 
          self.canevas.create_text(10, 10, anchor =NW, text ='Un ptit texte', #methode anchor, nordwest 
                            font=('Arial', 20, 'bold italic'), fill ='blue') 
          # la méthode anchor permet une ancre dans une certaine zone du canevas. 10,10 est la coordonnée d'un point dans cette zone 
       def commande2(self): 
          cercle(self.canevas, 125, 125, 20) 
          cercle(self.canevas, 120, 122, 4) 
          cercle(self.canevas, 130, 122, 4) #un visage très moche 
          cercle(self.canevas, 125, 130, 6) 
          #ben voilà quoi des cercles... 
       def effacer(self): 
          """Ca effacera tout ce qu'il y a dans le canevas""" 
          self.canevas.delete(ALL) 
    appli = Application() 
    appli.mainloop() #n'oublions pas ...

  4. #4
    Membre éclairé
    Avatar de airod
    Homme Profil pro
    Gérant Associé, DMP Santé et Directeur technique
    Inscrit en
    Août 2004
    Messages
    767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Gérant Associé, DMP Santé et Directeur technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 767
    Points : 891
    Points
    891
    Par défaut
    perso je regarderais du coté de la méthode ".update()"

    je pense que c'est ca qu'il te manque. Forcer le rafraichissement des données dans ta frame.
    A+

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Salut,
    le fait de creer un canvas ne me permet pas d'inclure de checkbutton a l'interieur, c'est seulement utilise pour des graphiques. Donc cette solution ne me convient pas.
    Pour le .update, j'ai essayer mais ce n'est pas ca non plus.

    voila a quoi ressemble mon code:
    ...
    self.pane1=PanedWindow(Frame3, orient=HORIZONTAL)
    self.pane1.pack(expand="yes",fill="both")

    Frame31 = Frame(self.pane1)
    Frame31.pack()
    self.pane1.add(Frame31, width=100)

    self.Frame32 = Frame(self.pane1)
    self.Frame32.pack()
    self.pane1.add(self.Frame32, width=100)
    ...
    for self.varTemp in range (nb):
    self.checkbuttonChoixPieces[self.varTemp] = \
    classcheckbuttonChoixPieces(Frame31,tempNom, self.varTemp2[self.varTemp], noRow, noField, varPremiereEtape, self.pane1, self.Frame32).check()


    class classcheckbuttonChoixPieces:

    def __init__(self, frame1, nom, var, noRow, noField,varPremiereEtape, pane1, Frame32):
    self.frame1 = frame1
    self.nom = nom
    self.var = var
    self.noRow = noRow
    self.noField = noField
    self.varPremiereEtape = varPremiereEtape
    self.pane1 = pane1
    self.Frame32 = Frame32

    def check(self):
    tab = Checkbutton(self.frame1,
    text = self.nom,
    variable = self.var,
    command = self.comcheckB)
    return tab


    def comcheckB(self):
    noRow = 0
    for nbComposants in range(len(TabSteps[self.varPremiereEtape][3][1][self.noField])):
    text = TabSteps[self.varPremiereEtape][3][1][self.noField][nbComposants]
    Checkbutton(self.Frame32, text = text).grid(row = noRow, column =0, sticky =W)
    noRow = noRow+1
    Voila, j'ai bien conscience que ca ne marche pas, du fait que je n'efface pas le contenu de la frame a chaque fois. Et donc je vois afficher les nouveaux checkbutton par dessus les anciens..
    J'ai essayer plusieurs methodes, tel que supprimer la frame du panel, puis en creer une nouvelle au panel, mais ca ajoute une nouvelle frame au panel pour chaque checkbutton de la 1ere frame.

    A mon avis c'est ma structure qui est a revoir, mais je ne sais pas comment m'y prendre.

    Si quelqu'un a une idee...

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    En fait j'ai penser a une autre maniere de proceder, plus propre que l'autre. Malheureusement je ne vois pas comment faire.
    Dans une frame j'aurais la 1ere liste de checkbutton, et le fait de cliquer sur l'un d'entre eux fera s'afficher en dessous de ce checkbutton la liste des checkbutton correspondant (un peu a la maniere du gestionnaire de peripheriques de windows).
    Je ne sais pas si c'est facilement realisable, ou il va falloir bidouiller pour y arriver.
    Avez vous une idee?
    Merci d'avance

  7. #7
    Membre éclairé
    Avatar de airod
    Homme Profil pro
    Gérant Associé, DMP Santé et Directeur technique
    Inscrit en
    Août 2004
    Messages
    767
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Gérant Associé, DMP Santé et Directeur technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 767
    Points : 891
    Points
    891
    Par défaut
    Peut être que ca peut t'aider!?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    import Tkinter as tk
     
     
    class interface:
        def __init__(self):
            self.root=tk.Tk()
            self.root.title('initilisation de frame')
            self.frame1=tk.Frame(self.root,height=20,width=50,bg='red')
            self.frame1.grid(padx=5,pady=5)
     
            self.frame2=tk.Frame(self.root,height=20,width=50,bg='red')
            self.frame2.grid(padx=5,pady=5)
     
            self.bou1=tk.Button(self.frame1,width=15,text='1',command=lambda text='111111': self.change(text))
            self.bou1.grid()
            self.bou2=tk.Button(self.frame1,width=15,text='2',command=lambda text='222222': self.change(text))
            self.bou2.grid()
            self.bou3=tk.Button(self.frame1,width=15,text='QUIT',command=self.root.quit)
            self.bou3.grid()
     
            self.root.mainloop()
            self.root.destroy()
     
        def change(self,text):
            try:
                self.texte.configure(text=text)
     
            except:
                self.texte=tk.Label(self.frame2,text=text)
                self.texte.grid()
     
     
     
    if __name__ == "__main__":
        app=interface()
    A+

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Ok, merci airod, grace a ton code, j'ai reussi a faire ce que je voulais.
    En utilisant la commande "command=lambda x,y : self.comcheckB(x,y)", j'ai pu eviter de passer par une classe, et donc j'ai effacé la frame Frame32 avant d'en creer une nouvelle:

    self.checkbuttonChoixPieces[self.varTemp] = Checkbutton(Frame31, text = tempNom, variable = self.varTemp2[self.varTemp], command=lambda var1=varPremiereEtape, var2=noField: self.comcheckB(var1, var2))

    def comcheckB(self, varPremiereEtape, noField):

    self.pane1.forget(self.Frame32)
    self.Frame32 = Frame(self.pane1)
    self.Frame32.pack(side='top')
    noRow = 0

    for nbComposants in range(len(TabSteps[varPremiereEtape][3][1][noField])):
    text = TabSteps[varPremiereEtape][3][1][noField][nbComposants]
    Checkbutton(self.Frame32, text = text).grid(row = noRow, column =0, sticky =W)
    noRow = noRow+1

    self.pane1.add(self.Frame32, width=150, sticky =W)
    Donc comme ca, ca marche.

    Encore merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment effacer le contenu d'une zone de text type date sans error
    Par saidm dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 07/06/2009, 02h51
  2. Réponses: 3
    Dernier message: 07/10/2004, 17h02
  3. comment effacer le contenu d'une table ttable
    Par naw dans le forum Bases de données
    Réponses: 4
    Dernier message: 07/07/2004, 16h13
  4. Comment effacer le contenu d'une scrollbox???
    Par Leclair2000 dans le forum C++Builder
    Réponses: 2
    Dernier message: 01/07/2004, 16h34
  5. Comment effacer un Tick sur une TrackBar ?
    Par ZeImp dans le forum Composants VCL
    Réponses: 2
    Dernier message: 19/08/2003, 21h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo