Bonjour à tous,

c'est la première fois pour moi que je demande qquchse sur ce forum, donc voilà, je viens de finir ma première année de BTS SIO(Services Informatique aux Organisations) ( pour vous situer mon niveau) je travaille sur un logiciel de calcul matriciel lié à la biochimie (Cahier des charges(plus ou moins) : https://www.dropbox.com/s/56q420clei...arges.pdf?dl=0 )

, depuis une semaine, on m'a demandé de le faire en python que je ne connais pas bien à part pour des tout petits programmes sur console (vraiment très petits, j'aurais voulu le faire en VB car je m'y connais plus surtout pour de la programmation objet), donc je découvre depuis peu python mais surtout Tkinter.

L'archive "premier test" en pièce jointe est le premier mini programme que j'ai fait pour m'entrainer avant de "m'attaquer" au gros(gros à mon gout ) et l'archive "control" est celle du programme que je dois faire et dont je vous ai copier/coller le code.Control.rar premier test.rar

Pour l'instant je suis sur la saisie d'une matrice j'ai créer une classe matrice avec (lignes, colonnes)( fichier : model.py) , et j'ai aussi créer une classe à part( fichier ctrl.py ) de contrôle d'édition de matrice et c'est dans cette classe que je suis perdue.

Sur la fenêtre il y a à gauche 2 entry pour la saisie du nombre de lignes et de colonnes de la matrice à droite qui est composé de boutons indicatifs qui donnent le nom de chaque lignes et colonnes (Ex: S1 --> Substrat 1, R1 --> Réaction 1) et à l'intérieur d'Entry pour chaque valeur de la matrice, j'ai besoin d'aide pour récuperer le nombre de lignes/colonnes et créer les boutons et les champs de la matrice en conséquence .

Merci beaucoup pour votre temps, si vous avez des remarques ou des conseils ditez moi ça m'aiderait beaucoup .


voici le code du fichier ctrl.py:

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
# -*-coding:utf-8 -*
# ctrl
from tkinter import *
from model import *
#Cette classe hérite de tkinter.Frame (objet graphique)
class ctrlEditMatrice(Frame):
    "Controleur graphique pour l'édition d'une matrice" # pour la documentation
    def __init__(self, parent,matr):
        Frame.__init__(self,parent) #appel du constructeur de la classe parente
        self.parent = parent # on conserve en attribut la fenêtre parente qui contient le controleur
        self.matr = matr # on met en attribut la matrice à éditer
        self._initialize() # on appelle la méthode d'initialisation du widget
 
    def _initialize(self):
        "méthode privée appelée par le constructeur pour charger et remplir les éléments graphiques" # commentaire de documentation
 
        #crée et positionne les widget de la colonne 0 qui servent au choix du nombre de lignes/colonnes
        self.label_NbreLignes = Label(self, text="Nombre de lignes:")
        self.label_NbreLignes.grid(column=0, row=0, sticky='NSEW')
        self.label_NbreColonnes = Label(self, text="Nombre de colonnes:")
        self.label_NbreColonnes.grid(column=0, row=2, sticky='NSEW')
        self.entry_NbreLignes = Entry(self, textvariable="3")
        self.entry_NbreLignes.grid(column=0, row=1, sticky='NSEW') # positionne le champ dans la grille
        self.entry_NbreColonnes = Entry(self, textvariable="4")
        self.entry_NbreColonnes.grid(column=0, row=1, sticky='NSEW') # positionne le champ dans la grille
        self.btn_Val_L_C = Button(self, text= "Valider")#, command= self._updateMatrModelLC)
        self.btn_Val_L_C.grid(column=0,row=5, sticky='NSEW')
        #crée et positionne le bouton qui efface toutes les values des entry de la matrice
        self.btn_Erase_All = Button(self, text= "Effacer tout")#, command=)
        self.btn_Erase_All.grid(column=2,row=0)
 
 
        try:
            int_nb_l = int(self.entry_NbreLignes.get())
        except :
            raise ValueError("Vous n'avez pas entrer un int")
 
        try:
            int_nb_c = int(self.entry_NbreColonnes.get())
        except :
            raise ValueError("Vous n'avez pas entrer un int")
 
 
        #affiche le nom des lignes/colonnes de la matrice
        for i in range (int_nb_l):
            self.btn_S_M = Button(self, text=("S"+str(i+1)), width=10)
            self.btn_S_M.grid(column=2, row=(i+1+3), sticky='NSEW')
        for i in range (int_nb_c):
            self.btn_R_M = Button(self, text=("R"+str(i+1)), width=10)
            self.btn_R_M.grid(column=(i+1+2), row=0, sticky='NSEW')
 
        #reation des entre de saisie de values de la matrice
        rows = []
        for i in range(int_nb_l+4):
            cols = []
            for j in range(int_nb_c+3):
                self.entry_Matrice = Entry(self, justify='CENTER', cursor='pencil')
                #self.entry_Matrice.insert(END '(%d , %d)' % ((i-4), (j-3)))
                cols.append(self.entry_Matrice)
                self.entry_Matrice.grid(column=j, row=i)
            rows.append(cols)
 
    # methode de mise à jour du nom dans le modèle après modif sur l'interface
    def _updateMatrModelLC(self):
        self.matr.lignes= int_nb_l
        self.matr.colonnes= int_nb_c
 
"""# methode de mise à jour du nom dans le modèle après modif sur l'interface
    def _updateMatrModelAll(self):
        self.matr.lignes= self.entry_NbreLignes.get()
        self.matr.colonnes= self.entry_NbreColonnes.get()
        for i in range (self.lignes):
            for j in range (self.colonnes):
                self.tableau[i][j] = self..get()
 
"""
    # méthode permettant d'afficher le controleur
    def show(self):
        self.pack()
Le code du fichier model.py:
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
# -*-coding:utf-8 -*
# object model classes
from numpy import *
from tkinter import *
class Matrice:
    "classe métier représentant une classe" # documentation
    def __init__(self, lig, col):
        #self.nom = nom
        self.lignes = lig
        self.colonnes = col
        self.tableau = [] #Initailise la representat° interne de la matrice
#comme un tableau
        for i in range(self.lignes):
            l =[]
            for j in range(self.colonnes):
                l.append(None)
            self.tableau.append(1)
 
# accesseurs
    def getLignes(self):
        return self.lignes
 
    def setLignes(self, value):
        self.lignes = value
 
    def getColonnes(self):
        return self.colonnes
 
    def setColonnes(self, value):
        self.colonnes = value
 
    def getTableau(self):
        return self.tableau
 
    def Ask_lig_col(self):
        self.lignes=int(input("Nombre de lignes:"))
        self.colonnes=int(input("Nombre de colonnes:"))
 
 
    def __call__(self,i,j):
        """permet d'obtenir l'entrée (i,j) de la matrice A en tapant A(i,j),
        autrement dit informatiquement, en considérant la matrice
        comme fonction de i,j
        on pourra voir l'entrée A(2,1) d'ut matrice A simplement
        avec la syntaxe: >>A(2,1)"""
        return self.tableau[i][j]
 
    def __add__(self, autre):
        """renvoie la somme de la matrice self et de la matrice
        autre"""
        if (isinstance (autre, Matrice)):
            if (self.lignes == autre.lignes and self.colonnes == autre.colonnes):
                m = Matrice (self.lignes, self.colonnes)
                m.remplir(lambda i,j: self(i,j) + autre(i,j))
                return m
            else:
                raise ValueError("Dimension des matrices incompatibles")
        else:
            raise ValueError("L'objet que vous voulez ajouter n'est pas une matrice")  
            """si A et B sont deux objets de notre classe matrice,
            elle sera appelee si on tape: A+B  """
 
    def __mul__(self, autre):
        """renvoie le produit de la matrice self avec la matrice autre"""
        if (isinstance (autre, Matrice)):
            if (colonnes.lignes == autre.lignes):
                m = Matrice (self.lignes, self.colonnes)
                for k in range (autre.lignes):
                    m.remplir(lambda i,j: self(i,j) * autre(k,j))
                    return m
            else:
                raise ValueError("Dimension des matrices incompatibles")
        else:
            raise ValueError("L'objet que vous voulez multiplier n'est pas une matrice")
 
    """def __iter__(self):
        ""Permet de faire des boucles for qui parcourent
        les entrées de la matrice"
        for ligne in self.tableau:
            for entree in ligne:
                yield (entree)""remplace le return
                fabrique un objet= générateur => ce qu'on peut utilisé dans une
                boucle for (ex: range(1,n) est aussi un générateur)""
                """
 
    def matrice_Identite(self):
        if (self.lignes == self.colonnes):
            matrice = eye(self.lignes)
            return matrice
        else:
            raise ValueError("La matrice n'est pas carrée")
    def inversion (self):
        if (self.lignes == self.colonnes):
            linalg.inv(self.tableau)
        else:
            raise ValueError("La matrice n'est pas carrée")
    def delete_values(self):
        for lignes in self.tableau:#utilise la methode __iter__ pour parcourir
            for entree in lignes:
                entree = None
Voici le code du fichier main.py:

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
# -*-coding:utf-8 -*
from model import * # importe toutes les classes du fichier model.py
from ctrl import *  # importe toutes les classes du fichier ctrl.py
 
from tkinter import * # importe toutes les classes du module tkinter
 
#main function to load main window only.
if __name__ == "__main__":
    #instanciation de la fenetre principale
    window = Tk() # génère la fenêtre vide.
    window.title("Mon application Tkinter") # applique un titre à la fenêtre
    window.grid() # Définit la façon dont les éléments vont être organisés dans la fenêtre.
    # La grille et le moyen le plus cool pour gérer la disposition des éléments
    window.resizable(True,True) # Définit si on peut redimentionner la fenetre selon les axes X et Y.
    window.geometry("800x600") # Définit la taille par defaut.
 
    #chargement des données
    matrice_test = Matrice(3, 4)
    #chargement du widget
    widget1 = ctrlEditMatrice(window, matrice_test)
 
    widget1.show() # permet de réaficher le controleur 1
 
    window.mainloop() # boucle d'écoute des événements de la fenetre.

Et puis j'ai un autre fichier startProg.bat:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
@echo off
python main.py
pause