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 :

Disparition de widgets


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 11
    Par défaut Disparition de widgets
    Bonjour,

    j'ai un petit soucis sur une appli python héhé !

    Wala : je crée une fenêtre découpées en labels (pour pouvoir mettre une image d'arrière plan) et chacun de ces labels comporte un certain nombre d'éléments (entry, boutons, labels, etc..)

    Seulement, lorsque je m'amuse à déplacer ma fenêtre principale et que je la sors en partie de l'écran, soit tous mes widgets disparaissent, soit un certain nombre de ma fenêtre.
    Seules les labels avec les images de fond ne changent pas.

    De plus, si un bouton disparait et que je le survole simplement avec la souris, il réapparait à l'écran.

    Et pour finir si je réduis ma fenêtre et que je la restaure, tout reviens !

    Je ne comprends absolument pas d'où ça peut venir? Peut être un problème de focus? Mon label de dessous avec mon image s'affiche par dessus les autres?

    Besoin d'un coup de main

    Merki !

    PS : le code est un peu lourd, je vous fait un petit résumé :
    Une classe code permet de stocker les liens vers les images de fond et contient une fonction d'assemblage des labels de fond.

    J'ai créé une classe par 'morceau de fenêtre' (par label de fond). Cette classe contient simplement un dictionnaire de fonctions qui créent un nouveau label de fond pour nouvelle fonction.
    Ces labels sont ainsi assemblés via la fonction assemblage de la classe panneau (ci dessus).


    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
     
    #classe contenant le liens vers les images et une fonction d'assemblage de labels stockés dans des dictionnaires :
     
    class panneaux:
        def __init__(self, parent):     
     
            #importation des images de fond (chemin d'acces) :
     
            self.image_descriptif=ImageTk.PhotoImage(Image.open('../images/descriptif.jpg'))
            self.image_variable=ImageTk.PhotoImage(Image.open('../images/variable.jpg'))
     
            self.parent=parent
     
        #assemblage des panneaux :
        def assemblage(self, coin_inf_g, clef_dico_inf_g, milieu, clef_dico_milieu):
     
            LABEL_DESCRIPTIF=coin_inf_g.dico_label[clef_dico_inf_g]()
            LABEL_DESCRIPTIF.grid(row=1, column=0, rowspan=2, sticky='NSEW')
            LABEL_DESCRIPTIF.grid_propagate(0)        
     
            LABEL_VARIABLE=milieu.dico_label[clef_dico_milieu]()
            LABEL_VARIABLE.grid(row=1, column=1, sticky='NSEW')
            LABEL_VARIABLE.grid_propagate(0)
     
     
     
    #premiere classe 'creatrice' de fonction :
     
    class panneau_inf_gauche(panneaux):
        def __init__(self, parent):
            panneaux.__init__(self, parent)
     
     
            #creation du dictionnaire contenant toutes les fonctions, chaque fonction sert à créer un label qui sera griddé par l'assemblage de la classe panneaux :
     
            self.dico_label={99:self.img_descriptif_init}
     
        def img_descriptif_init(self):
            descriptif_label=Tkinter.Label(self.parent, image=self.image_descriptif, borderwidth=0)
            descriptif_label.image=self.image_descriptif
            return descriptif_label
     
     
     
     
     
    #seconde classe 'creatrice' de fonction :
     
    class panneau_milieu(panneaux):
        def __init__(self, parent):
            panneaux.__init__(self, parent)
     
     
            # creation du dictionnaire de fonctions : 
     
            self.dico_label={0:self.presentation}  
     
     
     
        #fonction créant le label :       
     
        def presentation(self):
     
            fond1=Tkinter.Label(self.parent, image=self.image_variable, borderwidth=0)
            fond1.image=self.image_variable
            fond1.grid_propagate(0)
     
            label_var=Tkinter.Label(fond1, bg='lightgray', width=75, height=30, relief='sunken', text='', takefocus=1)
            label_var.grid()
            label_var.grid_propagate(0)
     
            var=Tkinter.Label(label_var, font = 'Arial 12' , text='Hello ! Blabla Bla ! \n ...', bg='lightgray')
            var.grid(row=1, column=0)        
     
            return fond1

  2. #2
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 11
    Par défaut
    Mea culpa, je viens de voir que je ne vous avait pas mis les librairies et la main :

    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    #!/usr/bin/python
    # -*- coding:Utf-8 -*-
     
    import Tkinter
    from PIL import Image, ImageTk
     
    #classe contenant le liens vers les images et une fonction d'assemblage de labels stockés dans des dictionnaires :
    class panneaux:
        def __init__(self, parent):     
     
            #importation des images de fond (chemin d'acces) :
     
            self.image_descriptif=ImageTk.PhotoImage(Image.open('../images/descriptif.jpg'))
            self.image_variable=ImageTk.PhotoImage(Image.open('../images/variable.jpg'))
     
            self.parent=parent
     
        #assemblage des panneaux :
        def assemblage(self, coin_inf_g, clef_dico_inf_g, milieu, clef_dico_milieu):
     
            LABEL_DESCRIPTIF=coin_inf_g.dico_label[clef_dico_inf_g]()
            LABEL_DESCRIPTIF.grid(row=1, column=0, rowspan=2, sticky='NSEW')
            LABEL_DESCRIPTIF.grid_propagate(0)        
     
            LABEL_VARIABLE=milieu.dico_label[clef_dico_milieu]()
            LABEL_VARIABLE.grid(row=1, column=1, sticky='NSEW')
            LABEL_VARIABLE.grid_propagate(0)
     
     
     
    #premiere classe 'creatrice' de fonction :
     
    class panneau_inf_gauche(panneaux):
        def __init__(self, parent):
            panneaux.__init__(self, parent)
     
     
            #creation du dictionnaire contenant toutes les fonctions, chaque fonction sert à créer un label qui sera griddé par l'assemblage de la classe panneaux :
     
            self.dico_label={99:self.img_descriptif_init}
     
        def img_descriptif_init(self):
            descriptif_label=Tkinter.Label(self.parent, image=self.image_descriptif, borderwidth=0)
            descriptif_label.image=self.image_descriptif
            return descriptif_label
     
     
     
     
     
    #seconde classe 'creatrice' de fonction :
     
    class panneau_milieu(panneaux):
        def __init__(self, parent):
            panneaux.__init__(self, parent)
     
     
            # creation du dictionnaire de fonctions : 
     
            self.dico_label={0:self.presentation}  
     
     
     
        #fonction créant le label :       
     
        def presentation(self):
     
            fond1=Tkinter.Label(self.parent, image=self.image_variable, borderwidth=0)
            fond1.image=self.image_variable
            fond1.grid_propagate(0)
     
            label_var=Tkinter.Label(fond1, bg='lightgray', width=75, height=30, relief='sunken', text='', takefocus=1)
            label_var.grid()
            label_var.grid_propagate(0)
     
            var=Tkinter.Label(label_var, font = 'Arial 12' , text='Hello ! Blabla Bla ! \n ...', bg='lightgray')
            var.grid(row=1, column=0)        
     
            return fond1
     
    if __name__ == "__main__":
        app=Tkinter.Tk()
     
        descriptif=panneau_inf_gauche(app)
        variable=panneau_milieu(app)
     
        panneaux(app).assemblage(descriptif, 99, variable, 0)
     
        app.mainloop()

    Voila, si vous essayez de sortir la fenêtre de l'écran, le texte du label_var ou carrément tout le label_var disparait de ma fenêtre..
    Si on rajoute des choses dans le label_var du style des boutons, etc... ça fait le même effet sur eux.

    Qqn aurait-il une idée?

  3. #3
    Membre chevronné
    Homme Profil pro
    Responsable du parc et des réseaux de télécommunication
    Inscrit en
    Mai 2003
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable du parc et des réseaux de télécommunication
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2003
    Messages : 290
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        def presentation(self):
     
            fond1=Tkinter.Label(self.parent, image=self.image_variable, borderwidth=0)
            fond1.image=self.image_variable
            fond1.grid_propagate(0)
     
            label_var=Tkinter.Label(self.parent, bg='lightgray', width=75, height=30, relief='sunken', text='', takefocus=1) 
            label_var.grid(row=1, column=1)
            label_var.grid_propagate(0)
     
            var=Tkinter.Label(self.parent, font = 'Arial 12' , text='Hello ! Blabla Bla ! \n ...', bg='lightgray')
            var.grid(row=1, column=1)        
     
            return fond1
    Je n'ai pas bien compris ce que tu veux faire, mais tu devrais utiliser des Frame ou des Canvas pour regrouper tes widgets.

    Ex :
    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
    class MyFrame(tk.Frame):
        def __init__(self,parent):
            tk.Frame.__init__(self,parent)
            self.img=ImageTk.PhotoImage(Image.open('test.jpg'))
            self.fond=tk.Label(self,image=self.img)
            self.fond.grid(row=0,column=0)
     
        def add_widget(self,widget):
            widget.grid()
            nbcol,nbrow=self.grid_size()
            self.fond.grid_forget()
            self.fond.grid(row=0,column=0,rowspan=nbrow,columnspan=nbcol)
    if __name__=="__main__":        
        root=tk.Tk()
        frame=MyFrame(root)
        frame.grid(row=0,column=0,sticky='nsew')
        for i in range(5):
            l=tk.Label(frame,text="label %s" %(i))
            frame.add_widget(l)
        b=tk.Button(frame,text="quitter",command=root.quit)
        frame.add_widget(b)
        root.mainloop()

  4. #4
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 11
    Par défaut
    Salut ! Et merci de ta réponse !

    Je pensais pas que les paramètre rowspan et columnspan du grid pouvait faire que l'image reste en arrière plan !
    J'avais toujours vu cette fonction comme un quadrillage brut de la fenêtre, sans superposition des éléments..

    Je vais essayer ça, merci
    Je te tiens au courant.

  5. #5
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 11
    Par défaut
    Salut à tous !

    Tout d'abord merci beaucoup à pierjean, ça marche nickel maintenant, mes widgets disparaissent plus de ma fenetre !

    Par contre maintenant j'ai un autre soucis.. J'ai voulu tenter des modifications de me fenetre principale comme yoshidu62 sur ce post : http://www.developpez.net/forums/d26...ntenu-fenetre/

    Ca marche assez bien, le seul soucis c'est que lorsque je "recré" ma frame, j'ai un gros blanc d'un quart de seconde... Je suppose que ça vient du délai entre la destruction de la première frame et la création de la seconde..

    Le programme marche bien sinon, mais c'est juste pour le plaisir des yeux.

    Comment faire pour ne pas avoir ces blancs? Faire un enchainement : creation de la nouvelle frame --> destruction de l'ancienne --> affichage de la nouvelle ? (plutot que destruction --> creation --> affichage)
    Ou bien y a t-il un paramètre de Tkinter à définir?

    Merci !

    N@bot

  6. #6
    Membre chevronné
    Homme Profil pro
    Responsable du parc et des réseaux de télécommunication
    Inscrit en
    Mai 2003
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable du parc et des réseaux de télécommunication
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2003
    Messages : 290
    Par défaut
    Bonjour,
    Tu peux montrer ton code ?

Discussions similaires

  1. disparition activeX calendrier
    Par djool dans le forum Access
    Réponses: 10
    Dernier message: 26/01/2005, 12h31
  2. [preference] disparition des preférences de eclipse
    Par champion dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 01/07/2004, 11h14
  3. [GDI] Disparition d'un Bouton...
    Par Strider dans le forum MFC
    Réponses: 4
    Dernier message: 20/02/2004, 08h50
  4. [SWT]Eclipse Java : swt.widgets.Table
    Par watson dans le forum SWT/JFace
    Réponses: 3
    Dernier message: 01/10/2003, 09h07
  5. Disparition d'un objet
    Par Francky033 dans le forum DirectX
    Réponses: 2
    Dernier message: 14/07/2003, 15h44

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