81

对于 Django 应用程序,每个“成员”都被分配了一种颜色以帮助识别它们。它们的颜色存储在数据库中,然后在需要时打印/复制到 HTML 中。唯一的问题是我不确定如何Hex在 python/django 中生成随机颜色。生成 RGB 颜色很容易,但要存储它们,我要么需要 a)在我的“成员”模型中创建三个额外的列,要么 b)将它们全部存储在同一列中并使用逗号分隔它们,然后,稍后,解析 HTML 的颜色。这些都不是很吸引人,所以,我想知道如何Hex在 python/django 中生成随机颜色。

4

17 回答 17

164
import random
r = lambda: random.randint(0,255)
print('#%02X%02X%02X' % (r(),r(),r()))
于 2012-12-24T09:04:18.783 回答
58

这是一个简单的方法:

import random
color = "%06x" % random.randint(0, 0xFFFFFF)

要生成随机 3 char 颜色:

import random
color = "%03x" % random.randint(0, 0xFFF)

%x在基于 C 的语言中,它是一个字符串格式化程序,用于将整数格式化为十六进制字符串,而0x它是在 base-16 中写入数字的前缀。

如果需要,颜色可以以“#”为前缀(CSS 样式)

于 2013-08-03T17:32:59.523 回答
11

将其存储为 HTML 颜色值:

更新:现在接受整数 (0-255) 和浮点 (0.0-1.0) 参数。这些将被限制在允许的范围内。

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)

结果:

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'
于 2012-12-22T00:50:27.223 回答
9

派对迟到了,

import random
chars = '0123456789ABCDEF'
['#'+''.join(random.sample(chars,6)) for i in range(N)]
于 2014-03-07T03:44:57.757 回答
8

以前已经这样做过。与其自己实现,可能会引入错误,不如使用现成的库,例如Faker。看看颜色提供商,特别是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'
于 2015-07-22T14:25:40.140 回答
4

只需将它们存储为具有不同位偏移的三个通道的整数(就像它们通常存储在内存中一样):

value = (red << 16) + (green << 8) + blue

(如果每个通道都是 0-255)。将该整数存储在数据库中,并在需要返回不同通道时执行反向操作。

于 2012-12-22T00:28:23.013 回答
4
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()
于 2013-05-11T17:34:02.660 回答
3

有很多方法可以做到这一点,所以这里有一个使用“ colorutils ”的演示。

点安装 colorutils

可以在(RGB、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()

我当然希望这会有所帮助。

于 2016-11-13T06:38:51.390 回答
2

要生成随机任何东西,请查看random 模块

我建议您使用该模块生成一个随机整数,取模2**24,并将前 8 位视为 R,将中间 8 位视为 G,将后 8 位视为 B。
这都可以通过 div/mod 或按位来完成操作。

于 2012-12-22T00:30:01.533 回答
2
import random

def generate_color():
    color = '#{:02x}{:02x}{:02x}'.format(*map(lambda x: random.randint(0, 255), range(3)))
    return color
于 2015-07-17T15:05:27.337 回答
2

基本上,这将为您提供一个主题标签、一个转换为十六进制的 randint 和一个零填充。

from random import randint
color = '#{:06x}'.format(randint(0, 256**3))
#Use the colors wherever you need!
于 2017-11-22T04:44:54.970 回答
1
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
于 2013-08-24T04:24:11.050 回答
1
import random

def get_random_hex:
    random_number = random.randint(0,16777215)

    # convert to hexadecimal
    hex_number = str(hex(random_number))

    # remove 0x and prepend '#'
    return'#'+ hex_number[2:]
于 2019-09-24T05:49:10.597 回答
1

想改进这个解决方案,因为我发现它可以生成少于 6 个字符的颜色代码。我还想生成一个函数来创建一个列表,该列表可以在其他地方使用,例如在 matplotlib 中进行聚类。

import random

def get_random_hex:
    random_number = random.randint(0,16777215)

    # convert to hexadecimal
    hex_number = str(hex(random_number))

    # remove 0x and prepend '#'
    return'#'+ hex_number[2:]

我的建议是:

import numpy as np 

def color_generator (no_colors):
    colors = []
    while len(colors) < no_colors:
        random_number = np.random.randint(0,16777215)
        hex_number = format(random_number, 'x')
        if len(hex_number) == 6: 
            hex_number = '#'+ hex_number
            colors.append (hex_number)
    return colors
于 2019-11-25T09:26:46.857 回答
1

这是我根据十六进制颜色符号表示的简单代码:

import random 

def getRandomCol():
    
    r = hex(random.randrange(0, 255))[2:]
    g = hex(random.randrange(0, 255))[2:]
    b = hex(random.randrange(0, 255))[2:]

    random_col = '#'+r+g+b
    return random_col

十六进制颜色代码中的“#”只是表示所代表的数字只是一个十六进制数字。重要的是接下来的 6 位数字。这 6 个十六进制数字中的 2 个数字对分别代表 RGB(红色、绿色和蓝色)的强度。每种颜色的强度范围在 0-255 之间,不同强度的 RGB 组合产生不同的颜色。

例如,在 中#ff00ff,第一个ff相当于十进制的 255,下一个00相当于十进制的 0,最后一个ff相当于十进制的 255。因此,#ff00ff在十六进制颜色编码中等价于RGB(255, 0, 255).

有了这个概念,这里是我的方法的解释:

  1. r为每个和生成随机数的g 强度b
  2. 将这些强度转换为十六进制
  3. 忽略每个十六进制值的前 2 个字符'0x'
  4. '#'十六进制值r和 强度连接。gb

如果您想了解有关颜色如何工作的更多信息,请随时参考此链接:https ://hackernoon.com/hex-colors-how-do-they-work-d8cb935ac0f

干杯!

于 2019-12-28T09:07:37.263 回答
1
import secrets
rgba = '#'+secrets.token_hex(3)
于 2021-04-27T18:17:21.323 回答
0

嗨,也许我可以帮助生成随机十六进制颜色的下一个函数:

from colour import Color
import random as random
def Hex_color():
    L = '0123456789ABCDEF'
    return Color('#'+ ''.join([random.choice(L) for i in range(6)][:]))
于 2021-08-13T23:57:32.747 回答