И обновление шестнадцатеричных цветовых кодов

Застряли за платным доступом? Нажмите здесь, чтобы прочитать всю статью со ссылкой мой друг.

Часто бывает, что вам нужно, чтобы цвет элемента пользовательского интерфейса синхронизировался со значением. Например, при прогнозировании увольнения сотрудников более высокий процент обозначается более красным шрифтом или цветом фона, а меньший - более зеленым шрифтом / цветом фона, что может более эффективно передать сообщение.

Tkinter, де-факто стандартный пакет графического интерфейса для Python, позволяет вам поиграть с множеством вещей, включая цвет элементов пользовательского интерфейса. Однако цвет должен быть предоставлен, и в tkinter нет возможности динамического окрашивания.

Здесь мы создадим полезную небольшую определяемую пользователем функцию (UDF), которая будет возвращать шестнадцатеричный цвет из цветовой палитры градиента светофора на основе предоставленного возможного диапазона значений, фактического значения и направления палитры.

Во-первых, нам нужно понять, что такое шестнадцатеричный цветовой код.

Шестнадцатеричный код - это строка в формате #RRGGBB, где RR, GG и BB обозначают интенсивность красного, зеленого и синего компонентов, соответствующих цвету, в шестнадцатеричном формате. Десятичные значения интенсивности цвета варьируются от 0 (самый темный) до 255 (самый светлый). Это переводится в диапазон от 00 до FF при преобразовании в шестнадцатеричный формат. Итак, шестнадцатеричный код для черного - # 000000 (что означает, что все три компонента находятся в максимальной темноте). Точно так же для белого это #FFFFFF. Для чисто красного, зеленого и синего кода используются коды # FF0000, # 00FF00 и # 0000FF соответственно.

Вы можете поэкспериментировать с палитрой цветов Google, чтобы понять, как это работает для составных цветов, таких как желтый, коричневый и т. Д.

Теперь перейдем к коду.

Я создал минимальный пользовательский интерфейс tkinter, который состоит из метки внутри окна:

После запуска вы увидите следующее окно:

Здесь мы видим, что значение равно 0, а фон серый. Поскольку мы не указали цвет фона, по умолчанию он серый.

Чтобы добавить цвет фона, нам просто нужно передать его Label с помощью bg аргумента. Добавим черный:

pred = Label(mainframe, width=25, text=f"{value}%", bg='#000000', anchor='c',padx=5, font=('TkTextFont',12))

Теперь мы создадим функцию для предоставления цвета метке в зависимости от значения и палитры.

Во-первых, для простоты определим наш диапазон от 0 до 100, где 0 - плохо (красный), а 100 - хорошо (зеленый). 50 будет нейтральным (желтым). В этом случае коды плохого, нейтрального и хорошего должны быть # ff0000, # ffff00 и # 00ff00. От 0 до 50 красный - 255 (ff), а зеленый постепенно увеличивается от 0 (00) до 255 (ff). От 50 до 100 красный цвет уменьшается с 255 до 0, а зеленый остается 255. Синий остается 0 в обоих случаях.

Это можно представить как:

Этот код RGB теперь необходимо преобразовать в шестнадцатеричный цветовой код. Python имеет встроенный преобразователь целого числа в шестнадцатеричный.

print(hex(0)) возвращает 0x0, где 0x - это префикс, определяющий основание числа. print(hex(255)) возвращает 0xff. Нам просто нужно проигнорировать первые два символа и дополнить вывод справа 0, чтобы он имел длину 2. Это делается для всех трех кодов RGB, и полученная строка имеет префикс #, чтобы идентифицировать его как шестнадцатеричный. цветовой код. Этот однострочный файл делает это:

"#%s%s%s" % tuple([hex(c)[2:].rjust(2, "0") for c in (r, g, b)])

Давайте проверим эту логику!

Я изменил текст метки, чтобы отображать как значение, так и шестнадцатеричный код. Давайте посмотрим, как выглядят ярлыки для 0, 25, 50, 75 и 100:

Идеально!

А что, если нам нужно изменить направление? То есть 0 теперь хорошо, а 100 - плохо? Мы просто меняем местами значения красного и зеленого!

Запустив тот же скрипт с color = hexcolor(value, reverse=True), получаем:

Наконец, как насчет настраиваемых диапазонов? От 0 до 500? Мы модифицируем UDF, как показано ниже:

Запуск сценария с range = [0, 500] дает:

Все идет нормально. Как насчет [-100, 500]? Начиная со значения -100:

_tkinter.TclError: invalid color name “#ffx7f00”

Очевидно, что из-за отрицательного значения цветовые коды вычисляются как отрицательные, что приводит к недопустимому шестнадцатеричному коду.

Что нам нужно сделать, так это убедиться, что диапазон преобразован в положительный диапазон в UDF. Это можно сделать, установив минимальное значение на 0 и максимальное на abs(range[1]-range[0]), чтобы размер диапазона оставался прежним. Входное значение также необходимо масштабировать как value-range[0].

Наш окончательный код выглядит так:

Запустив это в диапазоне от -100 до 500, мы получим:

Большой! Все работает как положено.

Этот UDF можно использовать для любого элемента пользовательского интерфейса, где вы хотите, чтобы цвет указывал на значение. Реализация может быть не самой эффективной, и может даже существовать пакет или встроенная функция Python, которая уже делает это. Если вам известен какой-либо такой метод, дайте мне знать.