>>> hex2rgb('#abcdef')
(97, 98, 99, 100, 101, 102)
Здесь я использую вашу функцию hex2rgb()
без привязки вывода к каким-либо переменным. Он возвращает 6 значений, как и следовало ожидать, поскольку вы декодируете каждый символ из шестнадцатеричного значения (например, a
) в целочисленную кодовую точку Юникода, которая соответствует шестнадцатеричному a
: 97
. ( см. Документацию или ord () здесь )
>>> r,g,b = hex2rgb('#abcdef')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: too many values to unpack (expected 3)
При попытке распаковать их в три переменные возникает ошибка, поскольку ваша функция возвращает 6 переменных вместо ожидаемых 3.
>>> r,g,b = [hex2rgb('#abcdef')]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: not enough values to unpack (expected 3, got 1)
Ваш подход к переносу 6 целых чисел в список уменьшает возвращаемое значение с 6 переменных до всего 1 значения (список из 6 элементов), и, следовательно, это не решает вашу проблему.
Чтобы решить вашу проблему, вы должны найти способ получить 3 целых числа вместо 6. Для этого вам понадобится другой подход для декодирования вашего значения HEX.
Пары RGB в моем примере состоят из Red = AB, Green = CD, Blue = EF. Используя map()
с ord()
, вы переводите A
и B
отдельно в целое число, а это не то, что вам нужно, так как в итоге вы получаете 2 целых числа (97
и 98
) вместо 1 целого числа (171
), соответствующее значению AB
.
Итак, что вы хотите:
>>> int("0xAB",0)
171
Как видите, преобразование AB
вместе вернет правильное значение (171). См. этот ответ для примера того, как это сделать. Измените ваш hex2rgb()
, чтобы сделать это.
И последнее, но не менее важное: ваш подход к использованию ord()
для декодирования символов в целые числа интересен, но может и не быть правильным, поскольку A
и a
имеют другое значение кодовой точки Unicode (A = 65
, a = 97
), и поэтому они приводят к различным значениям для вашего цвета. В цветовых кодах HEX нет разницы между прописными и строчными буквами. При использовании метода с int()
, как описано выше, результат будет одинаковым для символов в нижнем или верхнем регистре и, следовательно, будет более правильным.