web-dev-qa-db-fra.com

Générer une couleur hexagonale aléatoire en Python

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.

49
sinθ
import random
r = lambda: random.randint(0,255)
print('#%02X%02X%02X' % (r(),r(),r()))
97
Dmitry Dubovitsky

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)

31
Eneko Alonso

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'
9
Roland Smith

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'
5
mknecht

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.

4
Keith Randall

peu tard pour la fête,

import random
chars = '0123456789ABCDEF'
['#'+''.join(sample(chars,6)) for i in range(N)]
4
Dinesh K.

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.

3
endorpheus
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()
3

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.

2
StoryTeller

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!
2
Christopher Marley
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
1
AllTheTime1111
import random

def generate_color():
    color = '#{:02x}{:02x}{:02x}'.format(*map(lambda x: random.randint(0, 255), range(3)))
    return color
0
Sevalad