Partage variables entre classe en PY

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

4 réponses

  1. 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
    1. Contributeur Ambassadeur
      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
      1. Contributeur Ambassadeur
        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
      2. Contributeur Ambassadeur
        @yg_beun 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
    2. 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
      1. Contributeur Ambassadeur
        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
    3. Contributeur Ambassadeur
      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