Partage variables entre classe en PY

billyV33 Messages postés 24 Statut Membre -  
yg_be Messages postés 23437 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

4 réponses

  1. billyV33 Messages postés 24 Statut Membre
     
    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
  2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    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. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      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
      1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > yg_be Messages postés 23437 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
  3. billyV33 Messages postés 24 Statut Membre
     
    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. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      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
  4. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    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