Partage variables entre classe en PY

billyV33 Messages postés 23 Date d'inscription   Statut Membre Dernière intervention   -  
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Je ne comprend pas comment partager les données, variables, matrice et autres entre des classe séparée en plusieurs fichiers
Par exemple, j'ai deux classe. Classe1 et classe2. Dans classe1 j'ai une var SIZE que je veux passer à la classe 2 pour la réinitialiser avec un autre int. Comment puis-je transmettre entre plusieurs classe ce qui est nécessaire? Merci beaucoup
classe1, principale, le main:

import ttkbootstrap
from ttkbootstrap import *
from classe2 import Reinitialiser


class Application(ttkbootstrap.Window):

def __init__(self):
super().__init__()

self.SIZE = 5
self.TEMP_MAX = 1000
self.T = 100
self.A = 0.5
self.VITESSE = 50
self.c = 5

self.statutJouer = 0
self.cloneRemplir = False # utilise dans clone et appel grille depart

self.height = self.SIZE * self.c
self.width = self.SIZE * self.c
print("height hauteur ", self.height)
print("width largeur ", self.width)

self.matrice = [[0 for x in range(self.SIZE)] for y in range(self.SIZE)]
print(self.matrice)

# root window
self.fen1 = self.title("Logiciel de simulation d'un modèle Ising")
self.fen1 = self.geometry('900x600')
self.fen1 = self.style.theme_use(themename="superhero")

# Taille canvas MAX
self.can1 = Canvas(self.fen1, width=25, height=25, bg="aqua")
self.can1.pack(padx=5, pady=5)

print("application")
self.boutonGrilleDepart = tk.Button(self,
text='Reinitialiser',
command=Reinitialiser,
state=tk.ACTIVE)
self.boutonGrilleDepart.place(x=196, y=430)


if __name__ == "__main__":
app = Application()
app.mainloop()

</code >


<code>
# classe2 qui devrait pouvoir utiliser les variables, le can1 de la classe1
import ttkbootstrap
from ttkbootstrap import *

class Reinitialiser:

def __init__(self):
super().__init__()
self.SIZE = 8
# self.width = self.width
# self.height = self.height

# self.can1 = self.can1

print("Reinitialiser SIZE", self.SIZE)
self.matrice = [[1, -2, 1, -1, -1], [1, -2, 1, -2, -2],
[1, 1, -2, 2, -2], [1, 1, -1, 2, 2], [2, 2, 2, 2, -1]]

# print(self.width, self.height)

print(self.matrice)





Configuration: Linux / Firefox 91.0
A voir également:

4 réponses

billyV33 Messages postés 23 Date d'inscription   Statut Membre Dernière intervention  
 
Rebonjour, j'ai aussi du mal à comprendre comment avec un constructeur sans nom, je pourrais construire un objet. Un peu perdu en Python Désolé! Merci beaucoup!
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
bonjour,
tes classes s'appellent Application et Reinitialiser.
tu as deux modules que tu appelles classe1 et classe2.

je me demandes si Reinitialiser ne devrait pas plutôt être une méthode de la classe Application.
pourquoi as-tu choisi de faire cela avec deux modules?

que veux-tu obtenir, en réalité?
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
un exemple:
module1.py:
class classe1:
    def __init__(self):
        self.SIZE=123
    def Reinitialiser(self):
        self.SIZE=456

module2.py:
import module1
app=module1.classe1()
print(app.SIZE)
app.Reinitialiser()
print(app.SIZE)

module2.py pourrait aussi être:
from module1 import classe1
app=classe1()
print(app.SIZE)
app.Reinitialiser()
print(app.SIZE)
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
un autre exemple, peut-être plus proche de ce que tu essayais de faire:
module1.py:
class classe1:
    def __init__(self):
        self.SIZE=123

module2.py:
import module1
class classe2 (module1.classe1):
    def Reinitialiser(self):
        self.SIZE=456
app=classe2()
print(app.SIZE)
app.Reinitialiser()
print(app.SIZE)
0
billyV33 Messages postés 23 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour, J'ai testé et je comprends un peu mieux. Par contre, quand je veux transférer mes compréhensions dans le code suivant, je ne trouve pas comment faire en sorte d'appeler Redessiner dans redessiner.py à partir de application.py pour le clic bouton
Quelques questions: :)
1- pourquoi quand je change le constructeur __init__ d'application.py avec un nom, l'interface ne s'affiche pas en bleu avec le bouton?
2- est-ce que c'est une bonne façon de partager le code? Pour l'interface (application.py) avoir les boutons et tout ce que je vais mettre à l'ouverture de la fenêtre mais, appeler le code suite à l'appuie sur les boutons et d,autres événements sur d'autres fichiers?
Il y a t-il un logique de partage de rôle? est-ce que je suis obligé de faire toujours des classes ou je pourrais avoir des fichiers avec juste une ou quelques fonctions?
Désolé, je suis un peu perdu!
Voici mon code:



import ttkbootstrap
from ttkbootstrap import *

class ClasseApplication(ttkbootstrap.Window):

def __init__(self):
super().__init__()

# root window
self.fen1 = self.title("Logiciel de simulation d'un modèle Ising")
self.fen1 = self.geometry('900x600')
self.fen1 = self.style.theme_use(themename="superhero")

self.can1 = Canvas(self.fen1, width=25, height=25, bg="aqua")
self.can1.pack(padx=5, pady=5)

self.SIZE = 5
self.TEMP_MAX = 1000
self.T = 100
self.A = 0.5
self.VITESSE = 50
self.c = 5

self.statutJouer = 0
self.cloneRemplir = False # utilise dans clone et appel grille depart

self.height = self.SIZE * self.c
self.width = self.SIZE * self.c
print("height hauteur ", self.height)
print("width largeur ", self.width)
print("application")

self.matrice = [[0 for x in range(self.SIZE)] for y in range(self.SIZE)]

self.boutonGrilleDepart = tk.Button(self,
text='Nouvelle grille',
# command= event clic bouton ???
state=tk.ACTIVE)
self.boutonGrilleDepart.place(x=196, y=430)

def getSize(self):
return self.SIZE

def getTemp(self):
return self.TEMP_MAX

def getT(self):
return self.T

def getA(self):
return self.A

def getVitesse(self):
return self.VITESSE

def getc(self):
return self.c

def getmatrice(self):
return self.matrice

def setSIZE(self, size):
self.SIZE = size

def setc(self, c):
self.c = c

def setmatrice(self, matrice):
self.matrice = matrice



if __name__ == "__main__":
app = ClasseApplication()
app.mainloop()


# appel à l redessiner.py

import application
from ttkbootstrap import *

class ClasseRedessiner(application.ClasseApplication):

def Redessiner(self):
print("matrice dans redessiner\n", len(self.matrice))
print("matrice dans redessiner:\n", self.matrice)
self.can1.delete(ALL)
t = 0
while t != self.width / self.c:
u = 0
while u != self.height / self.c:
x = t
y = u
if self.matrice[x][y] == -1:
self.can1.create_rectangle(x * self.c, y * self.c, x * self.c + self.c, y * self.c + self.c,
fill='blue')
elif self.matrice[x][y] == 1:
self.can1.create_rectangle(x * self.c, y * self.c, x * self.c + self.c, y * self.c + self.c,
fill='green')
elif self.matrice[x][y] == 2:
self.can1.create_oval(x * self.c, y * self.c, x * self.c + self.c, y * self.c + self.c, fill='red')
elif self.matrice[x][y] == -2:
self.can1.create_oval(x * self.c, y * self.c, x * self.c + self.c, y * self.c + self.c,
fill='yellow')
else:
self.can1.create_rectangle(x * self.c, y * self.c, x * self.c + self.c, y * self.c + self.c,
fill='grey')
u += 1
t += 1



# Redessiner.mainloop()


0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
Si tu veux mettre une fonction dans un autre module:
module1.py:
import module2
class classe1:
    def __init__(self):
        self.SIZE=123
    def Reinitialiser(self):
        module2.Reinitialiser(self)
app=classe1()
print (app.SIZE)
app.Reinitialiser()
print (app.SIZE)

module2.py:
def Reinitialiser(x):
    x.SIZE=456
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
reprenant ton code de départ, suggestion pour le module classe2.py:
def Reinitialiser(self):
        self.SIZE = 8
        # self.width = self.width
        # self.height = self.height

        # self.can1 = self.can1

        print("Reinitialiser SIZE", self.SIZE)
        self.matrice = [[1, -2, 1, -1, -1], [1, -2, 1, -2, -2],
                                  [1, 1, -2, 2, -2], [1, 1, -1, 2, 2], [2, 2, 2, 2, -1]]

        # print(self.width, self.height)

        print(self.matrice)
0