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 :

Gridder une classe dérivée de Frame


Sujet :

Tkinter Python

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 12
    Par défaut Gridder une classe dérivée de Frame
    Bonjour,
    J'ai créer une classe BalanceRVB dérivée de la classe Frame, composée de trois curseurs et je souhaite l’intégrer au programme principal.
    Voilà le programme principal (que j'écourte volontairement en enlevant les nombreuses fonctions qui y sont parce qu’il est trop long) :
    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
     
    from tkinter import *
    from PIL import Image, ImageTk
    from operations_image import *
     
     
     
    class TraitementImage2(Frame):
        "Traitement d'image dans sa version 2.0"
        def __init__(self,master=None,**Arguments):
            Frame.__init__(self,master,**Arguments)
     
            can=Canvas(self, width =5, height =5)
     
            Label(self,text="Entrez le nom du fichier :").grid(sticky=E)
            entree=Entry(self)
            entree.bind('<Return>',ouvrir)
            entree.grid(row=0,column=1,sticky=W)	
     
            Button(self,text='Filtre rouge',command=traitement_rouge,width=13).grid(row=1)
            Button(self,text='Filtre vert',command=traitement_vert,width=13).grid(row=2)
            Button(self,text='Filtre bleu',command=traitement_bleu,width=13).grid(row=3)
            Button(self,text='Niveau de gris',command=traitement_gris,width=13).grid(row=4)
            Button(self,text='Négatif',command=traitement_nega,width=13).grid(row=5)
            Button(self,text='Miroir horizontal',command=traitement_miroirhz,width=13).grid(row=6)
            Button(self,text='Miroir vertical',command=traitement_miroirvt,width=13).grid(row=7)
            Button(self,text='Roation 180°',command=traitement_rotation180,width=13).grid(row=8)
            Button(self,text='Photomaton',command=fen_nbappli,width=13).grid(row=9)
            Button(self,text="Enregistrer sous",command=enregistrer_sous,width=12).grid(row=30,column=3,padx=3,pady=3)
            Button(self,text="Appliquer",command=appliquer,width=12).grid(row=29,column=3,padx=3,pady=3)
            Button(self,text='Reset',command=resetCanvas,width=7).grid(row=30)
            Button(self,text='Annuler',command=undoCanvas,width=7).grid(row=29)
     
            BalanceRVB(self).grid(row=1,column=3,rowspan=20)
     
     
     
     
     
     
     
    if __name__ == "__main__":
        root=Tk()
        root.title('Traitement Image 2.0')
        fra=TraitementImage2(root)
        fra.pack(side=LEFT)
        root.mainloop()
    Et voilà la classe que j'ai importé depuis un autre fichier:
    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
     
    class BalanceRVB(Frame):
        """Curseurs pour faire la balance RVB"""
        def __init__(self, maitre=None):
            Frame.__init__(self)        # constructeur de la classe parente
            # Définition de quelques attributs d'instance :
            self.r, self.v, self.b = 0, 0, 0
     
            # Définition des 3 widgets curseurs :
            Scale(self, activebackground='red',length=255, orient=VERTICAL, sliderlength =15,
                  from_=255, to=-255,resolution =1,
                  showvalue =1, command = self.setRouge).grid(row=0,column=0)
            Scale(self, activebackground='green',length=255, orient=VERTICAL, sliderlength =15,
                  from_=255, to=-255,resolution =1,
                  showvalue =1, command = self.setVert).grid(row=0,column=1)
            Scale(self, activebackground='blue',length=255, orient=VERTICAL, sliderlength =15,
                  from_=255, to=-255,resolution =1,
                  showvalue =1, command = self.setBleu).grid(row=0,column=2)
     
     
        def setRouge(self, r):
            self.r = int(r)
            self.event_generate('<Control-Z>')
     
        def setVert(self, v):
            self.v=int(v)        
            self.event_generate('<Control-Z>')
     
        def setBleu(self, b):
            self.b = int(b)
            self.event_generate('<Control-Z>')
     
     
     
    if __name__ == '__main__':
        def afficherTout(event=None):
            lab.configure(text = '{0} - {1} - {2}'.\
                             format(fra.r, fra.v, fra.b))
        root = Tk()
        fra = BalanceRVB(root)
        fra.pack(side =TOP)
        lab = Label(root, text ='test')
        lab.pack()
        root.bind('<Control-Z>', afficherTout)
        root.mainloop()
    Le problème c'est qu'avec la méthode .grid() , le programme ne démarre même pas : le Shell me dit qu'un programme est en cours quand je veux le fermer mais rien ne s'affiche.
    Cependant, avec la méthode pack() ça marche, mais c'est vraiment peu usuel par rapport avec grid()

    Pourriez éclairer ma lanterne et m'expliquer ce qui se passe et ce que je dois faire ?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Serratonique Voir le message
    Le problème c'est qu'avec la méthode .grid() , le programme ne démarre même pas : le Shell me dit qu'un programme est en cours quand je veux le fermer mais rien ne s'affiche.
    Cependant, avec la méthode pack() ça marche, mais c'est vraiment peu usuel par rapport avec grid()

    Pourriez éclairer ma lanterne et m'expliquer ce qui se passe et ce que je dois faire ?
    Bonjour,

    Votre problème vient de là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class BalanceRVB(Frame):
        """Curseurs pour faire la balance RVB"""
        def __init__(self, maitre=None):
            # vous initialisez l'ancêtre sans lui affecter de widget maître 
            Frame.__init__(self)        # constructeur de la classe parente
    Essayez :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class BalanceRVB(Frame):
        """Curseurs pour faire la balance RVB"""
        def __init__(self, master=None, **kw):
            # super class inits
            Frame.__init__(self, master, **kw)
            # sous Python3, vous pouvez aussi écrire
            #super().__init__(master, **kw)
            # si vous préférez les notations abstraites
    Et... ?

    Ce qui se passe : sans widget parent votre dérivé de Frame ne peut pas être géré par l'instance actuelle de Tk() --> le geometry manager ne sait pas comment gérer cette situation et entre dans une boucle figée sans fin.

    Vous rencontrerez un problème similaire si vous mélangez des pack() et des grid() au sein d'un même widget parent : boucle figée sans fin.

    Voir ce qui se dit à ce sujet ici :

    http://effbot.org/tkinterbook/pack.htm

    Bon courage. @+.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 12
    Par défaut
    Merci beaucoup !
    Je vais essayé ça !

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Serratonique Voir le message
    Merci beaucoup !
    Je vais essayé ça !
    Si vous ramez trop avec le codage en dur de GUI Tkinter, vous pouvez essayer tkRAD :

    https://github.com/tarball69/tkRAD/wiki/Accueil

    Un exemple simple :

    https://github.com/tarball69/tkRAD/w...3Aeasy_builder

    Un exemple plus complet :

    https://github.com/tarball69/tkRAD/wiki/fr%3Afirst_app

    Je suis l'auteur de tkRAD, alors n'hésitez pas : posez-moi vos questions, je peux vous aider, y compris pour rédiger vos premiers XML.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 12
    Par défaut
    Merci beaucoup, ça marche !
    Pour tkinter, je commence tout juste à m'y habituer et puis je me dit que c'est une bonne chose de connaître ses bases, mais je retiens tout de même tkrad, merci pour l'info !

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Serratonique Voir le message
    Merci beaucoup, ça marche !
    Pour tkinter, je commence tout juste à m'y habituer et puis je me dit que c'est une bonne chose de connaître ses bases, mais je retiens tout de même tkrad, merci pour l'info !
    ça roule. @+.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 17/03/2007, 01h06
  2. problème d'accès dans une classe dérivée!
    Par chrono23 dans le forum C++
    Réponses: 47
    Dernier message: 10/10/2006, 11h22
  3. Réponses: 2
    Dernier message: 06/12/2005, 09h41
  4. Réponses: 4
    Dernier message: 20/11/2005, 05h48
  5. Déterminer le type d'une class dérivée
    Par LDDL dans le forum MFC
    Réponses: 3
    Dernier message: 10/12/2004, 17h36

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