Aller au contenu

ipythonblocks : présentation

ipythonblocks est un outil pédagogique qui propose de créer des grilles de cases colorées. Il permet d'expérimenter les concepts de contrôle de flux Python et de voir immédiatement les effets du code représentés de manière colorée et attrayante.

0. Généralités

- ipythonbocks sur PyPI

Pour retrouver la dernière version, les conseils d'installation : https://pypi.org/project/ipythonblocks/

- Le site ipythonblocks.org

Le site ipythonblocks.org propose de publier ses images et de consulter des exemples de grilles.

1. Grille : classe BlockGrid

ipythonblocks fournit une classe BlockGrid dont la représentation est une grille.
Pour créer (instancier) une grille, on appelle la méthode BlockGrid(width, height) où :

  • width est un entier : nombre de blocs par ligne
  • heightest un entier : nombre de blocs par colonne

Des paramètres optionnels peuvent être précisés :

  • fill est un triplet d'entiers, représentant les niveaux de (rouge, vert, bleu) entre 0 et 255. Sa valeur par défaut est (0, 0, 0), ce qui définit des blocs de couleur noire.
  • block_size est un entier, représentant la longueur des côtés des blocs de la grille en pixels. Sa valeur par défaut est 20, et sa valeur minimale est 1.
  • lines_on est un booléen, précisant si les lignes ente les blocs doivent être affichés ou non. Sa valeur par défaut est True.
from ipythonblocks import BlockGrid

Exemple 1

grille_A = BlockGrid(12, 4)
grille_A

Exemple 2

grille_B = BlockGrid(5, 6, fill=(230, 92, 92))
grille_B

Exemple 3

grille_C = BlockGrid(30, 10, block_size=8, fill=(52, 52, 150))
grille_C

2. Cellule : classe Block

Les cellules de la grille sont représentées par des objets de la classe Block .
On accède à une cellule de la grille en précisant ses coordonnées dans la grille entre crochets.
La première coordonnée est l'indice de ligne, la seconde l'indice de colonne. Les indices débutent à 0.

cellule = grille_C[0, 29] # cellule en haut à droite
cellule

Chaque cellule est dotée d'attributs grâce auxquels on peut lire et modifier les propriétés de cette cellule :

  • red, green et blue : entier indiquant le niveau de chaque couleur
  • rgb : triplet d'entiers indiquant les niveaux de (rouge, vert, bleu)
  • size : entier indiquant la dimension de la cellule

La position de la cellule dans la grille est donnée par des attributs qu'on ne peut pas modifier :

  • row: indice de ligne de la cellule
  • col: indice de colonne de la cellule

La méthode set_colors permet de modifier les niveaux de (rouge, vert, bleu).
Au survol de la souris, les coordonnées et la couleur de la cellule sont affichées.

cellule.red = 240
cellule
grille_C
couleurs = ['rouge', 'vert', 'bleu']
valeurs = cellule.rgb
for couleur, valeur in zip(couleurs, valeurs):
    print(couleur, valeur)
rouge 240
vert 52
bleu 150

Exemples

grille_D = BlockGrid(10, 10)
for cellule in grille_D:
    if (cellule.row + cellule.col) % 2 == 0:
        cellule.set_colors(255, 255, 255)
grille_D
grille_E = BlockGrid(10, 10)
for cellule in grille_E:
    if (cellule.row * cellule.col) % 2 == 0:
        cellule.set_colors(225, 225, 225)
grille_E
grille_F = BlockGrid(10, 10)
for cellule in grille_F:
    if (cellule.row == 7 or cellule.col == 3):
        cellule.set_colors(235, 235, 235)
grille_F
grille_G = BlockGrid(10, 10)
for cellule in grille_G:
    if (cellule.row > 7 or cellule.col <= 3):
        cellule.set_colors(205, 90, 90)
grille_G
grille_H = BlockGrid(10, 10)
for cellule in grille_H:
    k = cellule.row + cellule.col
    cellule.set_colors(20*k, 8*k, 10*k)
grille_H

3. Animation

Exemples

Méthode 1

import time
from IPython.display import clear_output
grille = BlockGrid(4, 3, block_size=30, fill=(52, 52, 100))

prec_cellule = None

for i in range(3):
    for cellule in grille:
        clear_output()
        cellule.blue = 255

        if prec_cellule is not None:
            prec_cellule.blue = 100

        grille.show()
        time.sleep(0.3)
        prec_cellule = cellule

Méthode 2

grille = BlockGrid(4, 3, block_size=30, fill=(52, 52, 100))

prec_cellule = None

for i in range(3):
    for cellule in grille:
        clear_output()
        cellule.blue = 255

        if prec_cellule is not None:
            prec_cellule.blue = 100

        grille.flash(display_time=0.5)
        prec_cellule = cellule

grille.show()