Bonjour à tous.

J'écris sur ce forum car je ne parviens pas à trouver une organisation de code satisfaisante pour un programme, qui me permette de ne pas soulever d'AttributeError.

Il s'agit d'une application qui possède deux frame, l'une dévouée à la connexion, l'autre au cœur de l'application, chacune étant définie par une classe. Le problème est que j'ai besoin d'accéder aux attributs de la première classe lorsque je manipule la deuxième pour pouvoir configurer l'application selon les souhaits de l'utilisateur. Or comme la première classe n'est pas encore instanciée lorsque je définie la seconde, l'interpréteur me renvoie une erreur du type "AttributeError: type object 'XXX' has no attribute 'XXX'".

Je sais qu'une solution pourrait être d'instancier la classe mais la façon dont j'ai construit le code ne me le permet pas : je crée les deux frames l'une sur l'autre en même temps après les avoir définies et je navigue dans les deux avec la fonction tkraise() pour afficher celle que je souhaite.

Voici le canevas du code qui pose problème :

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
114
115
116
class App(ttk.Frame):
    def __init__(self, parent):
        ttk.Frame.__init__(self)

        # le container contient les frames
        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand=True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.frames = {}

        for F in (LoginPage, MainPage):
            page_name = F.__name__
            frame = F(parent=container, controller=self)
            self.frames[page_name] = frame

            frame.grid(row=0, column=0, sticky="nsew")
       #J'affiche la première frame.
        self.show_frame("LoginPage")
        print(self.frames['LoginPage'].var_activity.get())

    def show_frame(self, page_name):
        frame = self.frames[page_name]
        frame.tkraise()

class LoginPage(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
 
         .
         .
         .


        # Create control variables
 
         .
         .
         .
        self.var_activity = tk.StringVar() #L'attribut en question est défini ici.
        

        # Create widgets
        self.setup_widgets()
 
        .
        .
        .

    def setup_widgets(self):
        .
        .
        .

        # Create a Frame for input widgets
        self.widgets_frame = ttk.Frame(self, padding=(0, 0, 0, 10))
        self.widgets_frame.grid(row=0, column=1, padx=10, pady=(30, 10), sticky="nsew", rowspan=3)
        self.widgets_frame.columnconfigure(index=0, weight=1)

        # Read-only combobox
        self.readonly_combo = ttk.Combobox(self.widgets_frame, state="readonly", textvariable=self.var_activity, values=self.readonly_combo_list)
        self.readonly_combo.current(0)
        self.readonly_combo.grid(row=3, column=0, padx=5, pady=10, sticky="ew")
        
 
         .
         .
         .



class MainPage(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
 
        .
        .
        .
   
        # Create widgets
        self.setup_widgets()
        
    def setup_widgets(self):

        # Create a Frame for input widgets
        self.widgets_frame = ttk.Frame(self, padding=(0, 0, 0, 10))
        self.widgets_frame.grid(row=0, column=1, padx=10, pady=(30, 10), sticky="nsew", rowspan=3)
        self.widgets_frame.columnconfigure(index=0, weight=1)
        

        #Le problème est ici, je souhaite récupérer l'attribut "var_activity" de LoginPage.
        # Accentbutton
        self.accentbutton1 = ttk.Button(self.widgets_frame, text=LoginPage.var_activity.get(), style="Accent.TButton", command=lambda : self.startPause())
        self.accentbutton1.grid(row=7, column=1, padx=5, pady=10, sticky="nsew")
        
     

if __name__ == "__main__":
    root = tk.Tk()
 
    .
    .
    .

    app = App(root)
    app.pack(fill="both", expand=True)
 
    .
    .
    .
    root.mainloop()
J'obtiens donc l'erreur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
AttributeError: type object 'LoginPage' has no attribute 'var_activity'
Sauriez-vous comment je peux accéder à cet attribut ?

Je vous remercie de votre aide et vous souhaite une excellente journée.

Cordialement,

Jessie.