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.