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] problème affichage


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 266
    Par défaut [tkinter] problème affichage
    Bonjour je crée une fenetre principale contenant un menu (pour quitter) et un canevas
    a ce canevas j'attache l'évenement du clic gauche de la souris et qd cet evenement a lieu alors je voudrais afficher unenouvelle fenetre contenant 3 curseurs mais seule la fenetre s'affiche sans les curseurs dedans...
    ca doit etre diiot masi je galere et je ne trouve pas
    merci de m'indiquer la solution


    voila mon code a corriger:
    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
    90
    91
     
    #! /usr/bin/env python
    # -*- coding: Latin-1 -*-
    import os, sys
     
    from Tkinter import *
    import Image
     
    class MenuBar(Frame):
        """Barre de menus déroulants"""
        def __init__(self, boss =None):
            Frame.__init__(self, borderwidth =2)
     
            ##### Menu <Fichier> #####
            fileMenu = Menubutton(self, text ='Fichier')
            #fileMenu.grid(row = 0, column = 0)
            fileMenu.pack(side =LEFT)
            # Partie "déroulante" :
            me1 = Menu(fileMenu)
            me1.add_command(label ='Terminer', underline =0, command = boss.quit)
            # Intégration du menu :
            fileMenu.configure(menu = me1)
     
     
    class Curseurs(Frame):
        def __init__(self, boss=None):
            Frame.__init__(self)        # constructeur de la classe parente
            self.vR, self.vV, self.vB = -1, -1, -1
            #composante rouge
            Scale(self, length=400, orient=HORIZONTAL, label ='Composante Rouge :',
                    troughcolor ='dark grey', sliderlength =20,
                    showvalue =0, from_=0, to=255, tickinterval =25,
                    command= lambda x, num=1 : updateLabel(x,num)).pack()
            lab1 = Label(self)
            lab1.pack()
            #composante verte
            Scale(self, length=400, orient=HORIZONTAL, label ='Composante Verte :',
                    troughcolor ='dark grey', sliderlength =20,
                    showvalue =0, from_=0, to=255, tickinterval =25,
                    command= lambda x, num=2 : updateLabel(x,num)).pack()
            lab2 = Label(self)
            lab2.pack()
            #composante bleue
            Scale(self, length=400, orient=HORIZONTAL, label ='Composante Bleue :',
                    troughcolor ='dark grey', sliderlength =20,
                    showvalue =0, from_=0, to=255, tickinterval =25,
                    command= lambda x, num=3 : updateLabel(x,num)).pack()
            lab3 = Label(self)
            lab3.pack()
            #on ajoute le bouton pour valider les valeurs choisies
            bouton = Button(self, text = 'Valider les nouvelles valeurs', command= lambda param1=X, param2=Y, param3=self.vR, param4=self.vV, param5=self.vB : validation(param1,param2,param3,param4,param5))
            bouton.pack()
     
            def updateLabel(x, num): #met a jour la valeur de chaque curseur pour l'afficher a l'utilisateur
                if (num == 1):
                    lab1.configure(text='Valeur actuelle = ' + str(x))
                    self.vR = x
                if (num == 2):
                    lab2.configure(text='Valeur actuelle = ' + str(x))
                    self.vV = x
                if (num == 3):
                    lab3.configure(text='Valeur actuelle = ' + str(x))
                    self.vB = x
     
            def validation(X, Y, a, b, c):#modifie les valeurs du pixel
                print 'il faut modifier le pixel en position ('+str(X)+','+str(Y)+') avec les composantes '+str(a)+' '+str(b)+' '+str(c)           
     
    class Application(Frame):
        """Application principale"""
        def __init__(self, boss =None):
            Frame.__init__(self)
            self.master.title('test')
            mBar = MenuBar(self)
            mBar.pack()
            self.canevas1 = Canvas(self, bg='light grey', height=500,
                              width=500, borderwidth =2)
            self.canevas1.pack()
            self.canevas1.bind("<Button-3>", self.affich_curseurs)
            self.pack()
     
        def affich_curseurs(self, event):
            X = str(event.x)
            Y = str(event.y)
     
            fen = Tk()
            fra = Curseurs(fen)
            fen.mainloop()
     
    if __name__ == '__main__':
        app = Application()
        app.mainloop()

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Février 2004
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 76
    Par défaut
    En utilisant un Toplevel ça marche:
    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
     
    class Curseurs(Frame):
        def __init__(self, boss=None):
            Frame.__init__(self)        # constructeur de la classe parente
            if boss is None:
                boss = self
            self.vR, self.vV, self.vB = -1, -1, -1
            #composante rouge
            Scale(boss, length=400, orient=HORIZONTAL, label ='Composante Rouge :',
                    troughcolor ='dark grey', sliderlength =20,
                    showvalue =0, from_=0, to=255, tickinterval =25,
                    command= lambda x, num=1 : updateLabel(x,num)).pack()
            lab1 = Label(boss)
            lab1.pack()
            #composante verte
            Scale(boss, length=400, orient=HORIZONTAL, label ='Composante Verte :',
                    troughcolor ='dark grey', sliderlength =20,
                    showvalue =0, from_=0, to=255, tickinterval =25,
                    command= lambda x, num=2 : updateLabel(x,num)).pack()
            lab2 = Label(boss)
            lab2.pack()
            #composante bleue
            Scale(boss, length=400, orient=HORIZONTAL, label ='Composante Bleue :',
                    troughcolor ='dark grey', sliderlength =20,
                    showvalue =0, from_=0, to=255, tickinterval =25,
                    command= lambda x, num=3 : updateLabel(x,num)).pack()
            lab3 = Label(boss)
            lab3.pack()
            #on ajoute le bouton pour valider les valeurs choisies
            bouton = Button(boss, text = 'Valider les nouvelles valeurs', command= lambda param1=X, param2=Y, param3=self.vR, param4=self.vV, param5=self.vB : validation(param1,param2,param3,param4,param5))
            bouton.pack()
    [...]
        def affich_curseurs(self, event):
            X = str(event.x)
            Y = str(event.y)
     
            top = Toplevel()
            fra = Curseurs(top)
            fra.pack()

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 266
    Par défaut
    merci ca marche niquel mais j'ai un souci
    losrque l'utilisateur deplace les curseurs de la petite fenetre affichée au clic de la souris, je veux mettre a jours les valeurs des curseurs puis lorsqu'il valide avec le bouton "valider els nouvelles valeurs" je voudrais passer ces valeurs a ma fonction "validation" mais malheureusement ici ma fonction recoit les valeurs initiales (-1, -1, -1) et non les valeurs définies par les curseurs
    autre probleme, je n'arrive pas a faire passer les valeurs X et Y (coordonnées du clic de souris) a ma fonction "validation"

    comment puis-je passer ces nouvelles valeurs ?

    merci pour votre aide

    voici le code:
    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
     
    #! /usr/bin/env python
    # -*- coding: Latin-1 -*-
    import os, sys
    from Tkinter import *
    import Image
    class MenuBar(Frame):
        """Barre de menus déroulants"""
        def __init__(self, boss =None):
            Frame.__init__(self, borderwidth =2)
            ##### Menu <Fichier> #####
            fileMenu = Menubutton(self, text ='Fichier')
            #fileMenu.grid(row = 0, column = 0)
            fileMenu.pack(side =LEFT)
            # Partie "déroulante" :
            me1 = Menu(fileMenu)
            me1.add_command(label ='Terminer', underline =0, command = boss.quit)
            # Intégration du menu :
            fileMenu.configure(menu = me1)
     
    class Curseurs(Frame):
        def __init__(self, boss=None):
            Frame.__init__(self)        # constructeur de la classe parente
            if boss is None:
                boss = self
     
            self.vR, self.vV, self.vB = -1, -1, -1
            #composante rouge
            Scale(boss, length=400, orient=HORIZONTAL, label ='Composante Rouge :',
                    troughcolor ='dark grey', sliderlength =20,
                    showvalue =0, from_=0, to=255, tickinterval =25,
                    command= lambda x, num=1 : updateLabel(x,num)).pack()
            lab1 = Label(boss)
            lab1.pack()
            #composante verte
            Scale(boss, length=400, orient=HORIZONTAL, label ='Composante Verte :',
                    troughcolor ='dark grey', sliderlength =20,
                    showvalue =0, from_=0, to=255, tickinterval =25,
                    command= lambda x, num=2 : updateLabel(x,num)).pack()
            lab2 = Label(boss)
            lab2.pack()
            #composante bleue
            Scale(boss, length=400, orient=HORIZONTAL, label ='Composante Bleue :',
                    troughcolor ='dark grey', sliderlength =20,
                    showvalue =0, from_=0, to=255, tickinterval =25,
                    command= lambda x, num=3 : updateLabel(x,num)).pack()
            lab3 = Label(boss)
            lab3.pack()
            #on ajoute le bouton pour valider les valeurs choisies
            bouton = Button(boss, text = 'Valider les nouvelles valeurs', command= lambda param1=X, param2=Y, param3=self.vR, param4=self.vV, param5=self.vB : validation(param1,param2,param3,param4,param5))
            bouton.pack()
            def updateLabel(x, num): #met a jour la valeur de chaque curseur pour l'afficher a l'utilisateur
                if (num == 1):
                    lab1.configure(text='Valeur actuelle = ' + str(x))
                    self.vR = x
                if (num == 2):
                    lab2.configure(text='Valeur actuelle = ' + str(x))
                    self.vV = x
                if (num == 3):
                    lab3.configure(text='Valeur actuelle = ' + str(x))
                    self.vB = x
            def validation(X, Y, a, b, c):#modifie les valeurs du pixel
                print 'il faut modifier le pixel en position ('+str(self.X)+','+str(self.Y)+') avec les composantes '+str(a)+' '+str(b)+' '+str(c)           
     
    class Application(Frame):
        """Application principale"""
        def __init__(self, boss =None):
            Frame.__init__(self)
            self.master.title('test')
            mBar = MenuBar(self)
            mBar.pack()
            self.canevas1 = Canvas(self, bg='light grey', height=500,
                              width=500, borderwidth =2)
            self.canevas1.pack()
            self.canevas1.bind("<Button-3>", self.affich_curseurs)
            self.pack()
        def affich_curseurs(self, event):
            self.X = str(event.x)
            self.Y = str(event.y)
            top = Toplevel()
            fra = Curseurs(top)
            fra.pack()
    if __name__ == '__main__':
        app = Application()
        app.mainloop()

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Février 2004
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 76
    Par défaut
    Plutôt que d'appeler une fonction à chaque fois qu'un curseur est déplacé, je te conseille d'utiliser les IntVar (ou StringVar) Tkinter:
    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
     
    class Curseurs(Frame):
        def __init__(self, boss=None):
            Frame.__init__(self)        # constructeur de la classe parente
            if boss is None:
                boss = self
     
            self.vR, self.vV, self.vB = IntVar(0),IntVar(0),IntVar(0)
            #composante rouge
            Scale(boss, length=400, orient=HORIZONTAL, label ='Composante Rouge :',
                    troughcolor ='dark grey', sliderlength =20,
                    showvalue =0, from_=0, to=255, tickinterval =25,
                    variable=self.vR).pack()
            lab1 = Label(boss, textvariable=self.vR)
            lab1.pack()
            #composante verte
            Scale(boss, length=400, orient=HORIZONTAL, label ='Composante Verte :',
                    troughcolor ='dark grey', sliderlength =20,
                    showvalue =0, from_=0, to=255, tickinterval =25,
                    variable=self.vV).pack()
            lab2 = Label(boss, textvariable=self.vV)
            lab2.pack()
            #composante bleue
            Scale(boss, length=400, orient=HORIZONTAL, label ='Composante Bleue :',
                    troughcolor ='dark grey', sliderlength =20,
                    showvalue =0, from_=0, to=255, tickinterval =25,
                    variable=self.vB).pack()
            lab3 = Label(boss, textvariable=self.vB)
            lab3.pack()
    La valeur d'une variable (e.g., self.vR) sera mise à jour automatiquement pour un curseur en la passant comme valeur de l'argument variable:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Scale(self,..., variable=self.vR)
    Sa valeur sera automatiquement affichée dans un label en faisant de la même façon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Label(self,..., textvariable=self.vR)
    self.X et self.Y n'existent que dans la classe Application. Si tu veux y accéder depuis Curseurs, tu peux les passer en arguments à l'instanciation de Curseurs, par exemple.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 266
    Par défaut
    tres bien merci bcp
    encore un dernier point :
    dans la fonction validation les 3 nouvelles valeurs passées (a,b,c) sont affichées comme ca: Y_VAR0 PY_VAR1 PY_VAR2
    comment dois-je en tirer une valeur ?

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Février 2004
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 76
    Par défaut
    Pour obtenir la valeur d'une IntVar() ou StringVar():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    self.vR.get()
    self.vV.get()
    ...

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

Discussions similaires

  1. Problème affichage image Tkinter
    Par passant dans le forum Tkinter
    Réponses: 5
    Dernier message: 14/10/2010, 21h37
  2. Réponses: 10
    Dernier message: 08/06/2009, 11h30
  3. Problème affichage primitive
    Par goutbouyo dans le forum DirectX
    Réponses: 4
    Dernier message: 29/12/2004, 18h25
  4. [Plugin][VE] Problème affichage
    Par sebb84 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 05/07/2004, 14h50
  5. [DOS] Problème affichage de DOS dans un Memo
    Par Pedro dans le forum API, COM et SDKs
    Réponses: 9
    Dernier message: 25/06/2004, 13h31

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