在Python中生成随机的十六进制颜色

94

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

19个回答

187
import random
r = lambda: random.randint(0,255)
print('#%02X%02X%02X' % (r(),r(),r()))

10
建议使用%02X代替%2X,这样如果需要的话就会填充前导0。否则,网页可能会出现问题,因为您可能会得到一个带有空格的值,例如# E1465 - FoamyGuy
5
对于"paranoid":打印('#%06X' % random.randint(256**3-1)) - Dmitry Dubovitsky
3
你在评论中提供的备选建议缺少一个参数,导致它无法运行。不过,print ('#%06X' % random.randint(0,256**3-1)) 可以正常工作。 - Hawkwing
5
作为一个变量:color = '#{:02x}{:02x}{:02x}'.format(r(), r(), r()) - tsveti_iko
可以使用print(f'#{r():02X}{r():02X}{r():02X')} - Ajay Maity
显示剩余2条评论

64

这里有一个简单的方法:

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

生成一个随机的3个字符的颜色:

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

%x 是在基于 C 的编程语言中的一种字符串格式化方法,用于将整数格式化为十六进制字符串,而 0x 是表示数字使用十六进制的前缀。

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


5
f-string 版本:f"#{random.randint(0, 0xFFFFFF):06x}" - bugmenot123

14

来晚了一点,

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

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'

2
这个怎么是随机的? - sluki

10

这个已经做过了。与其自己实现可能会导致出错,不如使用一个现成的库,例如 Faker。看一下color providers,特别是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'

使用第三方库时,如果使用不正确,会更容易引入错误,而使用像 f"#{random.randint(0, 0xFFFFFF)}" 这样的简单一行代码则不会。 - sluki
你的简单一行代码有漏洞,因为它返回的是一个整数,而不是十六进制字符串。 ;) - bugmenot123

4

只需将它们作为整数存储,其中三个通道位于不同的位偏移量上(就像它们经常在内存中存储的那样):

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

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


一些示例输出将有助于更好地理解此内容。 - baxx

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

漂亮易读且可重复调用的函数,感谢您提供这个。 - james-see

3
基本上,这将为您提供一个哈希标签,一个转换为十六进制的randint和一些零填充。
from random import randint
color = '#{:06x}'.format(randint(0, 256**3))
#Use the colors wherever you need!

3
import secrets

# generate 4 sets of 2-digit hex chars for a color with transparency
rgba = f"#{secrets.token_hex(4)}" # example return: "#ffff0000"

# generate 3 sets of 2-digit hex chars for a non-alpha color
rgb = f"#{secrets.token_hex(3)}" # example return: "#ab12ce"

rgba = '#'+secrets.token_hex(4)' - byteface

3

有很多种方法可以实现这个功能,这里提供一个使用"colorutils"的演示。

pip install 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()

我希望这对您有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接