Pour une application Django, une couleur est affectée à chaque "membre" pour faciliter son identification. Leur couleur est stockée dans la base de données puis imprimée/copiée dans le code HTML lorsque cela est nécessaire. Le seul problème est que je ne sais pas comment générer des couleurs Hex
aléatoires dans python/Django. Il est assez facile de générer des couleurs RVB, mais pour les stocker, il faudrait soit a) créer trois colonnes supplémentaires dans mon modèle "Membre", soit b) les stocker toutes dans la même colonne et utiliser des virgules pour les séparer, puis, plus tard, analyser les couleurs pour le code HTML. Aucune de ces méthodes n’est très attrayante, alors, encore une fois, je me demande comment générer des couleurs aléatoires Hex
en python/Django.
import random
r = lambda: random.randint(0,255)
print('#%02X%02X%02X' % (r(),r(),r()))
Voici un moyen simple:
import random
color = "%06x" % random.randint(0, 0xFFFFFF)
Pour générer une couleur aléatoire de 3 caractères:
import random
color = "%03x" % random.randint(0, 0xFFF)
%x
en langage C est un formateur de chaînes permettant de formater les entiers sous forme de chaînes hexadécimales, tandis que 0x
est le préfixe pour écrire des nombres en base 16.
Les couleurs peuvent être précédées de "#" si nécessaire (style CSS)
Stockez-le en tant que valeur de couleur HTML:
Mise à jour: accepte maintenant les arguments entiers (0-255) et float (0.0-1.0). Ceux-ci seront serrés à leur plage autorisée.
def htmlcolor(r, g, b):
def _chkarg(a):
if isinstance(a, int): # clamp to range 0--255
if a < 0:
a = 0
Elif a > 255:
a = 255
Elif isinstance(a, float): # clamp to range 0.0--1.0 and convert to integer 0--255
if a < 0.0:
a = 0
Elif a > 1.0:
a = 255
else:
a = int(round(a*255))
else:
raise ValueError('Arguments must be integers or floats.')
return a
r = _chkarg(r)
g = _chkarg(g)
b = _chkarg(b)
return '#{:02x}{:02x}{:02x}'.format(r,g,b)
Résultat:
In [14]: htmlcolor(250,0,0)
Out[14]: '#fa0000'
In [15]: htmlcolor(127,14,54)
Out[15]: '#7f0e36'
In [16]: htmlcolor(0.1, 1.0, 0.9)
Out[16]: '#19ffe5'
Cela a été fait avant. Plutôt que de mettre cela en œuvre vous-même, en introduisant éventuellement des erreurs, vous pouvez utiliser une bibliothèque prête, par exemple Faker . Jetez un coup d’œil aux fournisseurs de color , en particulier hex_digit
.
In [1]: from faker import Factory
In [2]: fake = Factory.create()
In [3]: fake.hex_color()
Out[3]: u'#3cae6a'
In [4]: fake.hex_color()
Out[4]: u'#5a9e28'
Il suffit de les stocker sous forme d’entier avec les trois canaux à différents décalages de bits (comme ils sont souvent stockés en mémoire):
value = (red << 16) + (green << 8) + blue
(Si chaque canal est compris entre 0 et 255). Stockez cet entier dans la base de données et effectuez l'opération inverse lorsque vous devez revenir aux canaux distincts.
peu tard pour la fête,
import random
chars = '0123456789ABCDEF'
['#'+''.join(sample(chars,6)) for i in range(N)]
Il y a tellement de façons de faire cela, alors voici une démonstration utilisant " colorutils ".
pip installer colorutils
Il est possible de générer des valeurs aléatoires dans (RVB, HEX, WEB, YIQ, HSV).
# docs and downloads at
# https://pypi.python.org/pypi/colorutils/
from colorutils import random_web
from tkinter import Tk, Button
mgui = Tk()
mgui.geometry('150x28+400+200')
def rcolor():
rn = random_web()
print(rn) # for terminal watchers
cbutton.config(text=rn)
mgui.config(bg=rn)
cbutton = Button(text="Click", command=rcolor)
cbutton.pack()
mgui.mainloop()
J'espère certainement que cela a été utile.
import random
def hex_code_colors():
a = hex(random.randrange(0,256))
b = hex(random.randrange(0,256))
c = hex(random.randrange(0,256))
a = a[2:]
b = b[2:]
c = c[2:]
if len(a)<2:
a = "0" + a
if len(b)<2:
b = "0" + b
if len(c)<2:
c = "0" + c
z = a + b + c
return "#" + z.upper()
Pour générer quelque chose d’aléatoire, jetez un coup d’œil au module random
Je vous suggérerais d’utiliser le module pour générer un entier aléatoire, prendre son modulo 2**24
et traiter les 8 premiers bits comme R, les 8 bits du milieu comme G et les 8 derniers comme B.
Tout peut être accompli avec des opérations div/mod ou bit à bit.
En gros, cela vous donnera un hashtag, un randint converti en hexadécimal et un remplissage de zéros.
from random import randint
color = '#{:06x}'.format(randint(0, 256**3))
#Use the colors wherever you need!
hex_digits = ['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f']
digit_array = []
for i in xrange(6):
digit_array.append(hex_digits[randint(0,15)])
joined_digits = ''.join(digit_array)
color = '#' + joined_digits
import random
def generate_color():
color = '#{:02x}{:02x}{:02x}'.format(*map(lambda x: random.randint(0, 255), range(3)))
return color