Как сделать шкалу выбора цвета в Tkinter?

Я пытаюсь создать шкалу выбора цвета для приложения Tkinter.

Меня не интересует модуль tkinter.colorchooser или отдельные шкалы для каждого канала RGB. Мне нужна единая шкала, такая как ползунок цвета в Photoshop.

В настоящее время у меня есть виджет вертикальной шкалы с целочисленными значениями RGB от 0 (#000) до 16777215 (#FFF). Проблема в том, что использование диапазона целых чисел RGB приводит к очень странной последовательности цветов — выбор не идет от красного к розовому, к синему и т. д., как на первом изображении ниже.

Вместо этого я получаю последовательность цветов на втором изображении. Он сильно сжат, потому что 16777215 различных цветов втиснуты в 300 пикселей. Третье фото - зум. Вы можете видеть, что он переходит от черного к зеленому, затем почти к черному к зеленому и т. д.

Цветовой ползунок в Photoshop
Градиент на основе целых чисел RGB
Рассмотрите градиент поближе

Вот соответствующая часть моего кода:

MAXRGBINT = 16777215  # Corresponds to (255, 255, 255)
scale = ttk.Scale(slidframe, orient=VERTICAL, length=75,
                  from_=0, to=MAXRGBINT,
                  command=lambda _: set_color('sprite'))

По сути, мне нужен виджет масштаба, который будет отображать цвета в «нормальном» порядке. Как я могу сделать это с числовыми значениями?


person fenceop    schedule 06.06.2015    source источник


Ответы (2)


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

Для того, что вы ищете, я бы предложил вместо этого использовать цветовое пространство HSL или HSV с рассматриваемая шкала, управляющая параметром Hue. Когда вам действительно нужны значения RGB, вы можете получить их путем преобразования из значений HSL/HSV (страница Википедии, на которую я ссылаюсь, объясняет, как это сделать).

person jangler    schedule 07.06.2015
comment
Спасибо джанглер. Это было легко реализовать и отлично работает. К вашему сведению, преобразование между HSL и RGB может выполняться автоматически с помощью такого модуля, как colour. - person fenceop; 07.06.2015

Вы можете использовать либо готовые цветовые карты matplotlib (струя, радуга и т. д.) from matplotlib import cm, либо создать свои собственные, а затем просмотреть значения rgb. Вы можете использовать тот факт, что стандартные обычно разделены на 256 значений (последний абзац). Если этого достаточно для вас, последнее будет, вероятно, самым простым.

Это то, что вы спрашивали?

person mmensing    schedule 06.06.2015
comment
Спасибо мменсинг. Ваше решение было легко реализовать, и оно обеспечивает большую гибкость благодаря большому количеству цветовых карт. В конечном итоге я использовал решение @jangler, потому что оно не требовало дополнительного модуля, но я бы принял оба ответа, если бы мог. - person fenceop; 07.06.2015