====== Création d'une grille et de configurations d'un système binaire modélisé ====== #!/usr/bin/env python # -*- coding: utf-8 -*- # travail de ML et MP, ba2 chimie 2012-2013 # Création d'une grille et de configurations d'un système binaire modélisé from Tkinter import * import math import random root = Tk() #Fonction appelée lors du clic sur le bouton "Rafraichir" def buttonClick(): #Effacement de la grille précédente c.delete(ALL) #Récupération des informations dans les différents champs nbLig = int(eLig.get()) nbCol = int(eCol.get()) nb1 = int(e1.get()) #Regénération de la nouvelle grille draw(nbLig, nbCol, nb1) #Sélection nombre de lignes Label(root, text="Nombre de lignes :").pack() eLig = Entry(root) eLig.pack() eLig.insert(0, "4") #Sélection nombre de colonnes Label(root, text="Nombre de colonnes :").pack() eCol = Entry(root) eCol.pack() eCol.insert(0, "4") #Sélection nombre de 1 Label(root, text="Nombre de 1 :").pack() e1 = Entry(root) e1.pack() e1.insert(0, "8") #Bouton de génération de la grille avec le nombre de lignes, colonnes et de 1 sélectionnés b = Button(root, text="Rafraichir la grille", command=buttonClick) b.pack() c = Canvas(root, width=600, height=600) c.pack() #Fonction de génération de la grille # nbLig: nombre de lignes # nbCol: nombre de colonnes # nb1: nombre de 1 def draw(nbLig, nbCol, nb1): #Taille de la grille size = nbLig*nbCol #Le traçage de la grille démarrera à la coordonnée (start, start) #ses côtés seront de longueur sideLength #Le point de fin d'une ligne sera donc de start+sideLength+1 (+1 afin de voir le contour de la grille) start = 50 sideLength = 400 end = start+sideLength+1 cellHeight = int(sideLength/nbLig) cellWidth = int(sideLength/nbCol) #Tableaux de 1 et de 2 table = [1]*nb1 table2 = [2]*(size-nb1) #Fusionner le tableau de 1 avec le tableau de 2 et les réordonner de manière aléatoire table.extend(table2) random.shuffle(table) #Dessiner la grille #Tracer les lignes horizontales #- Déplacer le y de la coordonnée de départ (start) jusqu'à la coordonnée de fin (end) # par intervalles de cellHeight (sideLength/nbLig) #- Tracer une ligne partant de la coordonnée (start, y) à la coordonnée (end, y) for y in range(start, end, cellHeight): c.create_line(start, y, end, y, fill="blue") #Tracer les lignes verticales #- Déplacer le x de la coordonnée de départ (start) jusqu'à la coordonnée de fin (end) # par intervalles de cellWidth (sideLength/nbCol) #- Tracer une ligne partant de la coordonnée (x, start) à la coordonnée (x, end) for x in range(start, end, cellWidth): c.create_line(x, start, x, end, fill="blue") #Remplir la grille de 1 et de 2 (présents dans le tableau) #Le milieu de la 1ère case se trouve aux coordonnées suivantes: x = start+int(cellWidth/2) y = start+int(cellHeight/2) #Prendre tous les éléments du tableau un par un #i contient l'index du tableau (1 -> size) #val contient l'élément présent dans le tableau (1 ou 2) for i, val in enumerate(table): #Ecrire 1 ou 2 au milieu de la case (coordonnée (w, h)) c.create_text(x, y, text=str(val)) #Prendre le modulo (reste de la division entière) de l'index i+1/nbCol (i+1 le tableau démarre à 0) #- Si = 0, il faut passer à la ligne suivante et revenir à la première colonne #- Sinon, il faut juste passer à la colonne suivante if (i+1) % nbCol == 0: x = start+int(cellWidth/2) y = y + cellHeight else: x = x + cellWidth #Calcul du nombre d'états possibles #N!/N1!(N-N1)! nbrEtats = int(math.factorial(size)/(math.factorial(nb1)*math.factorial(size-nb1))) c.create_text(50, 500, text="Nombre d'états possibles: " + str(nbrEtats), anchor="w") root.mainloop()