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 :

Problème de transmission d'informations d'une class à une autre class


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2011
    Messages : 58
    Par défaut Problème de transmission d'informations d'une class à une autre class
    Bonjour à tous,

    Je suis toujours en train de faire l'exercice de la page 246 du cours de Gérard Swinnen sur Python 3.

    Mon but est de redimensionner le canvas contenant l'image (ici un smiley) lors de l'appui sur le bouton "Dimensionner le canvas".

    Pour cela, dans la class "Fen_Controle", j'ai fait la procédure "Dimension_Canvas(self)" qui envoie les informations "ControleHorizontal.valeur" et "ControleVertical.valeur" à la procédure "Dimensionner_Canvas(autre_self)" de la class "Application".

    Le problème est que "self.fenetre_dessin.can.config()" ne fonctionne pas puisque que Python ne reconnaît pas le self de la class "Application". Mais lorsque je mets 2 paramètres à la procédure "Dimensionner_Canvas(self, autre_self)" de la class "Application" alors Python me dit que ma procédure "Dimension_Canvas(self)" de la class "Fen_Controle" n'envoie qu'un seul paramètre.

    Pourriez-vous me dire quelle est la solution à ce casse-tête dans lequel j'ai l'impression de tourner en rond?

    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
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    from tkinter import *
     
    class Bouton(Button):
     
        def __init__(self, boss, **Arguments):
            Button.__init__(self, boss, fg='white', bg='dark green',
                            font ='Times 14 bold italic', activebackground ="red",
                            activeforeground ="yellow", **Arguments)
     
     
    class Fenetre_Secondaire(Toplevel):
    #  Fenêtre contenant l'image à redimensionner
        def __init__(self):
            Toplevel.__init__(self)
            # on crée un Canvas....
            self.can = Canvas(self, bg='ivory')
            self.can.pack(padx=30, pady=30)
            self.overrideredirect(1) # => fenêtre sans bordure ni bandeau
            # ... et on y affiche une image
            self.img = PhotoImage(file='smiley2.gif')
            self.can.create_image(250, 150, image=self.img)
     
     
    class Boite(Frame):
     
        def __init__(self, Boss, flech=[0], orient="Vertical", valeur=150):
            Frame.__init__(self, Boss, bg ="khaki")
            if orient=='Vertical':
                Button(self, text='^', width=5, command=self.BoutonVerticalSup).pack()
                self.valeur = valeur
                print (valeur , " + ", self.valeur)
                self.lab = Label(self, text=self.valeur, bg='ivory', width=5)
                self.lab.pack(side=TOP)
                self.lab.configure(text = self.valeur)
                Button(self, text='v', width=5, command=self.BoutonVerticalInf).pack()
            else:
                Button(self, text='<', width=5, command=self.BoutonHorizontalInf).pack(side=LEFT)
                self.valeur = valeur
                print (valeur , " + ", self.valeur)
                self.lab = Label(self, text=self.valeur, bg='ivory', width=5)
                self.lab.pack(side=LEFT)
                self.lab.configure(text = self.valeur)
                Button(self, text='>', width=5, command=self.BoutonHorizontalSup).pack(side=RIGHT)
     
        def BoutonVerticalSup(self):
            self.valeur = self.valeur+10
            self.lab.configure(text = self.valeur)
     
        def BoutonVerticalInf(self):
            self.valeur = self.valeur-10
            self.lab.configure(text = self.valeur)
     
        def BoutonHorizontalSup(self):
            self.valeur = self.valeur+10
            self.lab.configure(text = self.valeur)
     
        def BoutonHorizontalInf(self):
            self.valeur = self.valeur-10
            self.lab.configure(text = self.valeur)
     
     
    class Fen_Controle(Toplevel):
     
        def __init__(self):
            Toplevel.__init__(self, bg ="khaki")
            # Contrôle Horizontal
            fleches = ['<', '>']
            self.ControleHorizontal = Boite(self, flech=fleches, orient='Horizontal', valeur=150)
            self.ControleHorizontal.pack(padx=5, pady=10)
     
            # Contrôle Verticale
            fleches = ['^', 'v']
            self.ControleVertical = Boite(self, flech=fleches, orient='Vertical', valeur=150)
            self.ControleVertical.pack(padx=5, pady=10)
     
            # Affichage des modifications du Canvas de la fenêtre secondaire
            Bouton(self, text='Dimensionner le canvas', command=self.Dimension_Canvas).pack(padx=10, pady=10)
     
        def Dimension_Canvas(self):
            Application.Dimensionner_Canvas(self)
     
    class Application(Frame):
     
        def __init__(self, boss):
            Frame.__init__(self, boss, bg='cadet blue', width=400, height=300)
            self.boss = boss
            self.fra = Frame(self, bg='cadet blue')
            self.fra.pack(side=BOTTOM, pady=5)
            Bouton(self.fra, text='Top1', command=self.Creer_Fen).pack(side=LEFT, padx=1, pady=2)
            Bouton(self.fra, text='Top2', command=self.Redim_Fen).pack(side=LEFT, padx=1, pady=2)
            Bouton(self.fra, text='Quitter', command=self.Quitter).pack(side=RIGHT, padx=1, pady=2)
            self.pack(fill=BOTH, expand=Y,side=BOTTOM)
            self.pack_propagate(0)
     
        def Creer_Fen(self):
            self.fenetre_dessin = Fenetre_Secondaire()
     
        def Dimensionner_Canvas(autre_self):
            self.fenetre_dessin.can.config(width=autre_self.ControleHorizontal.valeur
                                           , height=autre_self.ControleVertical.valeur)
     
        def Redim_Fen(self):
            Fen_Controle()
     
        def Quitter(self):
            self.boss.destroy()
     
     
    # --- Programme Principal ---
     
    fen = Tk()
     
    Application(fen).mainloop()
    Plus généralement, y a-t-il une solution simple pour résoudre le problème qui est que j'ai du mal à transmettre les informations d'une classe à une autre?

    Par avance, je vous remercie des éléments de réponse que vous pourrez me fournir.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 754
    Par défaut
    Salut,

    Plus généralement, y a-t-il une solution simple pour résoudre le problème qui est que j'ai du mal à transmettre les informations d'une classe à une autre?
    Classes et instances sont des animaux différents.

    Application est une classe le programme n'en utilise qu'une seule instance!
    Problème: le nom Application est "global" par contre comment accéder à l'instance? Pas besoin de créer des noms "globaux" mais passer l'objet application à ceux qui en ont besoin.
    Genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class Application:
        ....
        def Redim_Fen(self):
            Fen_Controle(app=self)
    Ce qui implique de modifier Fen_Controle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Fen_Controle(Toplevel):
     
        def __init__(self, app=None):
            self.app = app
            ...
    Pour remonter à application si besoin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        def Dimension_Canvas(self):
            self.app.Dimensionner_Canvas()
    Mais la vraie question est de savoir si toutes ces classes ne compliquent pas les choses.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2011
    Messages : 58
    Par défaut
    Mais la vraie question est de savoir si toutes ces classes ne compliquent pas les choses.
    Je suis d'accord avec vous : plus il y a de classes et plus c'est compliqué...

    Mais, j'ai essayé en mettant moins de classes et le problème est que j'ai obtenu des résultats peu conformes à ce que j'attendais au niveau graphique notamment lorsque je ne passais pas par les classes pour tout ce qui était création des Frames.

    Le problème général est que dès que j'utilise Tkinter je suis obligé de passer par des classes pour obtenir le résultat escompté sinon ça ne fonctionne pas bien avec notamment l'apparition de tout un tas de "parasitages".

    Je vous remercie beaucoup pour votre solution que je n'aurais pas pu trouvé seul et pour le temps que vous avez passé pour me répondre.

    Passez une très bonne journée wiztricks!

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 754
    Par défaut
    Salut,

    Mais, j'ai essayé en mettant moins de classes et le problème est que j'ai obtenu des résultats peu conformes à ce que j'attendais au niveau graphique notamment lorsque je ne passais pas par les classes pour tout ce qui était création des Frames.
    Les classes servent à structurer votre code.
    Ce qui se passe côté graphique se fait grâce à TCL/Tk qui ne connaît pas les classes de l'application Python.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Bouton(Button):
     
        def __init__(self, boss, **Arguments):
            Button.__init__(self, boss, fg='white', bg='dark green',
                            font ='Times 14 bold italic', activebackground ="red",
                            activeforeground ="yellow", **Arguments)
    Pourrait s'écrire comme une simple fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def Button(master, **kwds):
        cfg = dict(fg='white', bg='dark green', font ='Times 14 bold italic',
                    activebackground ="red", activeforeground ="yellow")
        return tk.Button(master, cfg, **kwds)
    Pour "Boite", vous avez un tronc commun indépendant d'horizontal et de vertical: Le tronc commun mérite d'être "classe", les "horizontal" et "vertical" ne sont que paramètrie réalisable dans 2 fonctions.

    Reprenez "Fen_Controle": en supprimant la méthode "Dimension_Canvas", une fonction suffirait.
    De plus, "Fen_Controle" ne devrait pas avoir à connaître app.
    Lorsque la commande Redim_Fen est invoquée, vous pourriez récupérer les height, width actuels et les passer à Fen_Controle sous forme de tk.IntVar.
    Fen_Controle se charge de les afficher (tk.Label(...textvariable=xyz) est la pour çà).
    Redim_Fen attend que l'utilisateur ait fait son choix via un .wait_window(Fen_Controle (...))
    C'est lui qui mettra à jour la geometrie du Canvas.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2011
    Messages : 58
    Par défaut
    Reprenez "Fen_Controle": en supprimant la méthode "Dimension_Canvas", une fonction suffirait.
    De plus, "Fen_Controle" ne devrait pas avoir à connaître app.
    Jai supprimé toutes références à "app" et remplacé la méthode "Dimension_Canvas" de "Fen_Controle" par la méthode "Dimensionner_Canvas".
    Mais le problème c'est que je ne vois pas comment redimensionner le "self.fenetre_dessin.can" directement dans "Fen_Controle" car il apparaît alors le message d'erreur suivant:
    AttributeError: 'Fen_Controle' object has no attribute 'fenetre_dessin'

    C'est le problème que j'avais au début, avant d'utiliser la méthode "Dimension_Canvas" qui faisait alors appel à la méthode "Dimensionner_Canvas" qui se trouvait dans la classe "Application" qui, elle, connaissait l'instanciation "fenetre.dessin" (et donc pas de message d'erreur 'Fen_Controle' object has no attribute 'fenetre_dessin').

    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
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    from tkinter import *
     
     
    class Bouton(Button):
     
        def __init__(self, boss, **Arguments):
            Button.__init__(self, boss, fg='white', bg='dark green',
                            font ='Times 14 bold italic', activebackground ="red",
                            activeforeground ="yellow", **Arguments)
     
     
    class Fenetre_Secondaire(Toplevel):
    #  Fenêtre contenant l'image à redimensionner
        def __init__(self):
            Toplevel.__init__(self)
            # on crée un Canvas....
            self.can = Canvas(self, bg='ivory')
            self.can.pack(padx=30, pady=30)
            self.overrideredirect(1) # => fenêtre sans bordure ni bandeau
            # ... et on y affiche une image
            self.img = PhotoImage(file='smiley2.gif')
            self.can.create_image(250, 150, image=self.img)
     
     
    class Boite(Frame):
     
        def __init__(self, Boss, flech=[0], orient="Vertical", valeur=300):
            Frame.__init__(self, Boss, bg ="khaki")
            if orient=='Vertical':
                Button(self, text='^', width=5, command=self.BoutonVerticalSup).pack()
                self.valeur = valeur
                self.lab = Label(self, text=self.valeur, bg='ivory', width=5)
                self.lab.pack(side=TOP)
                self.lab.configure(text = self.valeur)
                Button(self, text='v', width=5, command=self.BoutonVerticalInf).pack()
            else:
                Button(self, text='<', width=5, command=self.BoutonHorizontalInf).pack(side=LEFT)
                self.valeur = valeur
                self.lab = Label(self, text=self.valeur, bg='ivory', width=5)
                self.lab.pack(side=LEFT)
                self.lab.configure(text = self.valeur)
                Button(self, text='>', width=5, command=self.BoutonHorizontalSup).pack(side=RIGHT)
     
        def BoutonVerticalSup(self):
            self.valeur = self.valeur+10
            self.lab.configure(text = self.valeur)
     
        def BoutonVerticalInf(self):
            self.valeur = self.valeur-10
            self.lab.configure(text = self.valeur)
     
        def BoutonHorizontalSup(self):
            self.valeur = self.valeur+10
            self.lab.configure(text = self.valeur)
     
        def BoutonHorizontalInf(self):
            self.valeur = self.valeur-10
            self.lab.configure(text = self.valeur)
     
     
    class Fen_Controle(Toplevel):
     
        def __init__(self):
            Toplevel.__init__(self, bg ="khaki")
            # Contrôle Horizontal
            fleches = ['<', '>']
            self.ControleHorizontal = Boite(self, flech=fleches, orient='Horizontal', valeur=300)
            self.ControleHorizontal.pack(padx=5, pady=10)
     
            # Contrôle Verticale
            fleches = ['^', 'v']
            self.ControleVertical = Boite(self, flech=fleches, orient='Vertical', valeur=250)
            self.ControleVertical.pack(padx=5, pady=10)
     
            # Affichage des modifications du Canvas de la fenêtre secondaire
            Bouton(self, text='Dimensionner le canvas', command=self.Dimensionner_Canvas).pack(padx=10, pady=10)
     
        def Dimensionner_Canvas(self):
            self.fenetre_dessin.can.config(width=self_FenControle.ControleHorizontal.valeur
                                           , height=self_FenControle.ControleVertical.valeur)
     
     
    class Application(Frame):
     
        def __init__(self, boss):
            Frame.__init__(self, boss, bg='cadet blue', width=400, height=300)
            self.boss = boss
            self.fra = Frame(self, bg='cadet blue')
            self.fra.pack(side=BOTTOM, pady=5)
            Bouton(self.fra, text='Top1', command=self.Creer_Fen).pack(side=LEFT, padx=1, pady=2)
            Bouton(self.fra, text='Top2', command=self.Redim_Fen).pack(side=LEFT, padx=1, pady=2)
            Bouton(self.fra, text='Quitter', command=self.Quitter).pack(side=RIGHT, padx=1, pady=2)
            self.pack(fill=BOTH, expand=Y,side=BOTTOM)
            self.pack_propagate(0)
     
        def Creer_Fen(self):
            self.fenetre_dessin = Fenetre_Secondaire()
     
        def Redim_Fen(self):
            Fen_Controle()
     
        def Quitter(self):
            self.boss.destroy()
     
     
    # --- Programme Principal ---
     
    fen = Tk()
     
    Application(fen).mainloop()
    Etant véritablement novice en Python j'avoue que je galère pas mal et c'est probablement la raison pour laquelle j'utilise des façons de faire bancales.

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 754
    Par défaut
    Salut,

    Le problème est que "self.fenetre_dessin.can.config()" ne fonctionne pas puisque que Python ne reconnaît pas le self de la class "Application".
    Les classes permettent de créer des boîtes (instances) étrangères les unes aux autres. Les relations entre les instances de classes sont à construire.
    En passant, par exemple, l'instance de l'application (le self) à la création de Fen_Controle.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2011
    Messages : 58
    Par défaut
    Lorsque la commande Redim_Fen est invoquée, vous pourriez récupérer les height, width actuels et les passer à Fen_Controle sous forme de tk.IntVar.
    Fen_Controle se charge de les afficher (tk.Label(...textvariable=xyz) est la pour çà).
    Ca y est, j'ai remplacé les self.valeur par une liste à 2 éléments :
    Valeurs = [IntVar, IntVar] qui est passé comme variable globale.

    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
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    from tkinter import *
     
     
    class Bouton(Button):
     
        def __init__(self, boss, **Arguments):
            Button.__init__(self, boss, fg='white', bg='dark green',
                            font ='Times 14 bold italic', activebackground ="red",
                            activeforeground ="yellow", **Arguments)
     
     
    class Fenetre_Secondaire(Toplevel):
    #  Fenêtre contenant l'image à redimensionner
        def __init__(self):
            Toplevel.__init__(self)
            # on crée un Canvas....
            self.can = Canvas(self, bg='ivory')
            self.can.pack(padx=30, pady=30)
            self.overrideredirect(1) # => fenêtre sans bordure ni bandeau
            # ... et on y affiche une image
            self.img = PhotoImage(file='smiley2.gif')
            self.can.create_image(250, 150, image=self.img)
     
     
    class Boite(Frame):
     
        def __init__(self, Boss, flech=[0], orient="Vertical"):
            Frame.__init__(self, Boss, bg ="khaki")
            global Valeurs
            if orient=='Vertical':
                Button(self, text='^', width=5, command=self.BoutonVerticalSup).pack()
                self.lab = Label(self, text=Valeurs[1], bg='ivory', width=5)
                self.lab.pack(side=TOP)
                self.lab.configure(text = Valeurs[1])
                Button(self, text='v', width=5, command=self.BoutonVerticalInf).pack()
            else:
                Button(self, text='<', width=5, command=self.BoutonHorizontalInf).pack(side=LEFT)
                self.lab = Label(self, text=Valeurs[0], bg='ivory', width=5)
                self.lab.pack(side=LEFT)
                self.lab.configure(text = Valeurs[0])
                Button(self, text='>', width=5, command=self.BoutonHorizontalSup).pack(side=RIGHT)
     
        def BoutonVerticalSup(self):
            Valeurs[1] = Valeurs[1]+10
            self.lab.configure(text = Valeurs[1])
     
        def BoutonVerticalInf(self):
            Valeurs[1] = Valeurs[1]-10
            self.lab.configure(text = Valeurs[1])
     
        def BoutonHorizontalSup(self):
            Valeurs[0] = Valeurs[0]+10
            self.lab.configure(text = Valeurs[0])
     
        def BoutonHorizontalInf(self):
            Valeurs[0] = Valeurs[0]-10
            self.lab.configure(text = Valeurs[0])
     
     
    class Fen_Controle(Toplevel):
     
        def __init__(self):
            global Valeurs
            Toplevel.__init__(self, bg ="khaki")
            # Contrôle Horizontal
            fleches = ['<', '>']
            self.ControleHorizontal = Boite(self, flech=fleches, orient='Horizontal')
            self.ControleHorizontal.pack(padx=5, pady=10)
     
            # Contrôle Verticale
            fleches = ['^', 'v']
            self.ControleVertical = Boite(self, flech=fleches, orient='Vertical')
            self.ControleVertical.pack(padx=5, pady=10)
     
            # Affichage des modifications du Canvas de la fenêtre secondaire
            Bouton(self, text='Dimensionner le canvas', command=self.Dimensionner_Canvas).pack(padx=10, pady=10)
     
        def Dimensionner_Canvas(self):
            self.fenetre_dessin.can.config(width=Valeurs[0]
                                           , height=Valeurs[1])
     
     
    class Application(Frame):
     
        def __init__(self, boss):
            Frame.__init__(self, boss, bg='cadet blue', width=400, height=300)
            self.boss = boss
            self.fra = Frame(self, bg='cadet blue')
            self.fra.pack(side=BOTTOM, pady=5)
            Bouton(self.fra, text='Top1', command=self.Creer_Fen).pack(side=LEFT, padx=1, pady=2)
            Bouton(self.fra, text='Top2', command=self.Redim_Fen).pack(side=LEFT, padx=1, pady=2)
            Bouton(self.fra, text='Quitter', command=self.Quitter).pack(side=RIGHT, padx=1, pady=2)
            self.pack(fill=BOTH, expand=Y,side=BOTTOM)
            self.pack_propagate(0)
     
        def Creer_Fen(self):
            self.fenetre_dessin = Fenetre_Secondaire()
     
        def Redim_Fen(self):
            Fen_Controle()
     
        def Quitter(self):
            self.boss.destroy()
     
     
    # --- Programme Principal ---
     
    fen = Tk()
     
    Valeurs = [IntVar, IntVar]
    Valeurs = [300, 300]
     
    Application(fen).mainloop()
    Le problème c'est que Python renvoie toujours le même message d'erreur :
    AttributeError: 'Fen_Controle' object has no attribute 'fenetre_dessin'

    Redim_Fen attend que l'utilisateur ait fait son choix via un .wait_window(Fen_Controle (...))
    C'est lui qui mettra à jour la geometrie du Canvas.
    En ce qui concerne le ".wait_window()" j'ai du mal à voir comment l'utiliser même après la lecture du fichier traitant de Tkinter : "Tkinter 8.4 reférence"

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 754
    Par défaut
    Citation Envoyé par sancho.poncho Voir le message
    En ce qui concerne le ".wait_window()" j'ai du mal à voir comment l'utiliser même après la lecture du fichier traitant de Tkinter : "Tkinter 8.4 reférence"
    Ca se raconte ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class Fen_Controle(Toplevel):
     
        def __init__(self, vertical, horizontal):
            ...
     
    class Application(Frame):
     
        def Redim_Fen(self):
            # récupérer le height, width courant
            h = tk.IntVar(value=height)
            w = tk.IntVar(value=width)
            self.wait_window(Fen_Controle(h, w))
            # redimensionner le canvas avec les valeurs h.get() w.get()
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 27/02/2021, 16h57
  2. appelle d'une méthode d'une autre classe dans ma classe
    Par EpiTouille dans le forum Débuter
    Réponses: 5
    Dernier message: 08/08/2013, 08h30
  3. [Conception] Classe dans autre classe
    Par Rei Itchido dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 09/02/2008, 02h25
  4. Réponses: 0
    Dernier message: 08/02/2008, 16h44
  5. Réponses: 1
    Dernier message: 14/04/2007, 15h17

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