Pydiderot / pydiderotIDE

Environnement de dévelopement python adapté à l'enseignement et l'apprentissage de l'algorithmique.
MIT License
1 stars 2 forks source link

Gestion des couleurs dans graphique et repere #27

Closed cspaier closed 5 years ago

cspaier commented 5 years ago

La gestion des couleurs n'est pas cohérente dans repere et graphique:

Je propose d'uniformiser tout ca et d'utiliser le francais. En gros, soit on passe une variable rouge, soit on passe un string 'rouge'.

Préférences? Avis?

al-coloic commented 5 years ago

bleu=(0, 0, 255)

cspaier commented 5 years ago

Tu votes pour variables donc.

zebobs commented 5 years ago

Les variables globales c'est le mal. 'rouge'

al-coloic commented 5 years ago

j'avoue : global = pas bien. Mais si on veut bosser unu peu les coordonnées avec les futurs zaza du lycée un 3-uplet en RGB pour décrire une couleur prend tout son sens.

Et éventuellement, ça peut être travailer avec les autres élèves. Autre chose que la position dans le plan.

cspaier commented 5 years ago

Je commence à envisager de construire une classe Couleur qui pourrait etre initialisée à partir d'un string ou d'un triplet...

Comme ca:

C'est dégeux un peu non?

al-coloic commented 5 years ago

tkinter : couleur en string pygame : couleur en 3-uplet

et on a un conflit de definition de fonction si on charge les 2 lib en même temps

al-coloic commented 5 years ago

au cas on envisage la creation des classes, prendre en compte la transparence pour pygame

byache commented 5 years ago

En js, je comptais sur les couleurs prédéfinies et apparemment il y a des packages python qui font ça : https://pypi.org/project/webcolors/1.3/ Par exemple, python comprend 'grey', 'drak grey' 'sky blue' et ce genre de truc... Evidemment, le problème c'est que c'est en anglais. Du coup, on pourrait faire une fonction qui prend en argument une couleur en français et qui contient un dico français <-> anglais d'une vingtaine de couleurs, et qui : soit utilise les fonctions de traduction d'un package (mais ça oblige à ajouter ce package à la distri), soit contient également un dico name de type string<->valeurs rgb...

cspaier commented 5 years ago

tkinter : couleur en string pygame : couleur en 3-uplet

Deux problèmes:

  1. Gestion différente graphique vs repère
  2. 3-uplet uniquement pour pygame. Il faut pouvoir passer des 'rouge' ou rouge

On peut passer les couleurs dans une moulinette magique. Dans repere:

 def _couleur(c):
    """
    Teste si la couleur est de type str ou tuple et la convertit en hexadécimal
    Arguments:
        c (str ou tuple): Couleur sous forme de string ou de tuple rgb

    Returns:
        Couleur tkinter sous forme hexadécimale
    """
    couleurs = {
        'noir': '#000000',
        'blanc': '#FFFFFF',
        'gris': '#808080',
        'rouge': '#FF0000',
        'vert': '#00FF00',
        'bleu': '#0000FF',
        'jaune': '#FFFF00',
        'cyan': '#00FFFF',
        'magenta': '#FF00FF',
        'orange': '#FFA500',
    }

    if isinstance(c, tuple):
        return "#%02x%02x%02x" % c
    elif isinstance(c, str):
        if c.lower() in couleurs:
            return couleurs[c]
    # Au pire, on retourne c et on récupérera une erreur tkinter
    return c

Pour graphique:

def _couleur(c):
    """
    Teste si la couleur est sous forme de str et la convertit en rgb

    Arguements:
        c (str, tuple): Couleur sous forme str ou rgb
    Returns:
        couleur sous forme rgb
    """

    couleurs = {
        'noir': (0, 0, 0),
        'blanc': (255, 255, 255),
        'gris': (128, 128, 128),
        'rouge': (255, 0, 0),
        'vert': (0, 255, 0),
        'bleu': (0, 0, 255),
        'jaune': (255, 255, 0),
        'cyan':  (0, 255, 255),
        'magenta':(255, 0, 255),
        'orange': (255, 165, 0),
    }
    if isinstance(c, str):
        if c in couleurs:
            return couleurs[c]
    # Au pire on récupère une erreur pygame
    return c

Ensuite, il suffit de faire couleur = _couleur(couleur) à chaque fonction.

Le plus propre serait un décorateur pour ca. Si quelqu'un est chaud du python un peu théorique, faut pas hésiter!

Nos fonctions accepterons str ou tuple pour chaque couleur. Niveau typage c'est pas idéal mais je vois pas trop comment faire sinon.

Tant qu'on y est, on pourrait tester si le str commence par # et accepter l'héxa en entrée?

Il reste aussi à voir cette histoire de transparence.

cspaier commented 5 years ago

arf, je viens de voir ta réponse Paul :) Je regarde https://pypi.org/project/webcolors/1.3/

zebobs commented 5 years ago

Pour compléter l'info Numworks utilise la bibliotheque kadinsky

Voici un exemple pour un pixel coloré. col = kandinsky.color(126,0,255) kandinsky.set_pixel(x,y,col)

al-coloic commented 5 years ago

donc les minots travailleront sur la calculatrice en rgb ?

cspaier commented 5 years ago

Bon perso, faire coder les élèves sous calculatrice j'ai toujours trouvé ca sadique.

Après être cohérent entre nos libs et numworks ca peut pas faire de mal.

Par rapport à cette histoire de librairie, je suis pas sur que ce soit nécessaire pour faire une conversion hex <-> rgb <-> str:

def rgb2hex(rgb):
    return '#%02x%02x%02x' % rgb

def hex2rgb(hex):
    h = hex.lstrip("#")
    return tuple(int(h[i:i+2], 16) for i in (0, 2 ,4)

Du coup je serais tenté de mettre en place la suggestion détailllée plus haut:

Comme ca:

Objections?

al-coloic commented 5 years ago

si tu veux t'amuser, j'ai pas d'objections.

Plus : couleur en anglais et en français si possible ? Couleur prédéfinie : lesquelles ? http://www.science.smith.edu/dftwiki/index.php/Color_Charts_for_TKinter ? ou version simplifiée ?

cspaier commented 5 years ago

Pour l'instant je vais implémenter ces couleurs:

couleurs = {
        'noir': '#000000',
        'blanc': '#FFFFFF',
        'gris': '#808080',
        'rouge': '#FF0000',
        'vert': '#00FF00',
        'bleu': '#0000FF',
        'jaune': '#FFFF00',
        'cyan': '#00FFFF',
        'magenta': '#FF00FF',
        'orange': '#FFA500',
    }

Après, si quelqu'un veut en ajouter on prend. En attendant, on aura un truc cohérent et utilisable.

al-coloic commented 5 years ago

je pense que c'est largement suffisant pour nous. Si UN élève veut faire du magenta, je serais bien étonné !

byache commented 5 years ago

Expérience personnelle : les couleurs et la possibilité de mettre une petite image à la place d'un disque bleu (je compte le faire, ainsi que deux ou trois autres fonctions que j'avais l'habitude d'utiliser mais ce n'est pas urgent), ont un GROS succès. C'est totalement gadget, mais il faut ajouter (ce n'est bien sûr pas urgent non plus) : rose, marron, violet.

byache commented 5 years ago

A part ça, est ce que vous pouvez me faire une explication de texte sur : return '#%02x%02x%02x' % rgb

cspaier commented 5 years ago

@byache : On utilise l'opérateur de formatage de str python % et 02x le convertit en hexadécimal (voir).

Je pense faire un module couleurs comme ca on a un seul dict pour les couleurs et si on veut en rajouter c'est plus simple.

cspaier commented 5 years ago

Bon j'ai fait un truc et mis à jour la doc rapido.

Il faudrait gérer les erreurs plus proprement, et documenter.

cspaier commented 5 years ago

Documenté ici et en incluant ce fichier grace à .. mdinclude:: ../couleurs.md.

Si vous souhaitez ajouter des couleurs, c'est dans ce dict: https://github.com/cspaier/pydiderot/blob/6991d91cd414c275f78b9ec6896577f285d57805/Thonny/Lib/site-packages/couleurs.py#L16-L27

Il reste les erreurs mais c'est franchement moins urgent.