Closed cspaier closed 5 years ago
bleu=(0, 0, 255)
Tu votes pour variables donc.
Les variables globales c'est le mal. 'rouge'
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.
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?
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
au cas on envisage la creation des classes, prendre en compte la transparence pour pygame
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...
tkinter : couleur en string pygame : couleur en 3-uplet
Deux problèmes:
'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.
arf, je viens de voir ta réponse Paul :) Je regarde https://pypi.org/project/webcolors/1.3/
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)
donc les minots travailleront sur la calculatrice en rgb ?
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?
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 ?
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.
je pense que c'est largement suffisant pour nous. Si UN élève veut faire du magenta, je serais bien étonné !
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.
A part ça, est ce que vous pouvez me faire une explication de texte sur :
return '#%02x%02x%02x' % rgb
@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.
Bon j'ai fait un truc et mis à jour la doc rapido.
Il faudrait gérer les erreurs plus proprement, et documenter.
Documenté ici et là 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.
La gestion des couleurs n'est pas cohérente dans
repere
etgraphique
:str
en anglais:"red"
rouge
https://github.com/cspaier/pydiderot/blob/9716abb1cf72ed2c9bc7fc248dddc4e26cd992dd/Thonny/Lib/site-packages/graphique.py#L9-L14Je 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?