В этой небольшой заметке я рассказываю про именованные цвета tkinter и показываю как с ними можно работать. Попутно вы узнаете как с помощью python можно вытащить и обработать данные из web страницы и получить список всех возможных цветов. И, наконец, мы соорудим, две простецкие программы для просмотра списка цветов.
Tkinter использует именованные цвета. Поэтому для задания кода цвета можно зада��ь rgb код цвета или мы можем написать название. Так вместо '#C0C0C0' можем написать 'silver', вместо '#800000' - 'maroon'
Всё это замечательно, но в этой бочке мёда есть ложка дёгтя. Если вы знаете имена цветов, то вы получите правильный результат. А получить список доступных цветов из программы практически невозможно. Вызов тулкита, возвращающий список имен, видимо, отсутствует. Тем не менее, таблицу-справочник доступных имён можно найти в системной документации на tcl/tk,который лежит здесь:http://www.tcl.tk/man/tcl8.6.13/TkCmd/colors.htm .
Просмотр системной документации наводит нас на мысль, что в основе лежит список цветов системы X11. Кроме того, абсолютной точности тут может и не быть - этот список изменялся со временем, так что возможна небольшая разница между разными версиями этого списка. Поэтому мы просто обращаемся к последней версии документации.
Отметим, что некоторые цвета встречаются дважды, - например, "antique white" и "AntiqueWhite" представляют один и тот же цвет. Сделано это для удобства и упрощения кодирования программ.
Получаем список цветов из сети.
Я написал небольшое приложение gettkcolors.py, которое обращается к сайту с документацией, вытаскивает таблицу именованных цветов из системной документации и сохраняет все системные цвета в два локальных файла следующим образом:
CSVFILENAME = PROJECT_PATH / 'tkcolors.csv'
PYFILENAME = PROJECT_PATH / 'tknamedcolors.py'

Программа использует модуль request, забирает страницу в буфер и передаёт её в в процедуру разбора и получения списка цветов.
Вытащить цвета из страницы можно с помощью BeautifulSoup4. Это очень популярная библиотека для анализа страниц и извлечения данных из hmtl и xml. С её помощью мы можем вытаскивать данные из html таблиц в том числе. С помощью модулей requests и BeatifulSoup4, мы получаем универсальный механизм для вытаскивания данных из веб страниц для наших приложений.
Собственно сам разбор страницы занял 20 строк, а вся программа около 150. Реализовывать на python подобные алгоритмы очень удобно.
Таким способом мы получили внешний файл tknamedcolors.py, который содержит tuple со всеми именами цветов:
tkColorNames = ["alice blue","AliceBlue","antique white", "AntiqueWhite",
"AntiqueWhite1","AntiqueWhite2","AntiqueWhite3","AntiqueWhite4",
"aqua","aquamarine","aquamarine1","aquamarine2",
"aquamarine3","aquamarine4","azure","azure1",
"azure2","azure3","azure4","beige",
"bisque","bisque1","bisque2","bisque3",
"bisque4","black","blanched almond","BlanchedAlmond",
"blue","blue violet","blue1","blue2",
"blue3","blue4","BlueViolet","brown",
"brown1","brown2","brown3","brown4",
...
Быстренько делаем программу для визуализации полученного кортежа. И неожиданно обнаруживаем небольшое препятствие. При первоначальном запуске оказалось, что в системной документации есть две опечатки в именах цветов. При попытке установить цвета 'agua' и 'crymson' мы получаем ошибку. Вносим в нашу программу загрузки цветов исправление :
if cn == 'agua' :
cn = 'aqua'
if cn == 'crymson' :
cn = 'crimson'
Теперь мы можем закончить простейший просмотрщик имен цветов ( showmetkcolors.py ).

Если внимательно посмотреть на таблицу, то можно обнаружить, что некоторые цвета встречаются дважды. Например, все оттенки серого.
Как преобразовать название цвета в RGB
Сделать это можно с помощью вызова winfo_rgb(colorname) экземпляра toplevel.
r,g,b=self.mainwindow.winfo_rgb(colorname)
Справочник цветов
Теперь мы можем соорудить приложение, которое показывает все имена цветов и коды в виде дерева-showmecolorstree.py.
С помощью pygubu-designer (см. про pygubu-designer ссылку в конце статьи) мы делаем несложный интерфейс. И используем небольшой трюк для изображения цветных прямоугольников в качестве элементов treeview. Для отображения мы загружаем монохромное изображение прозрачного прямоугольника, и устанавливаем для него цвет фона:
def fill_colors(self):
"fill treeview with colors"
self.ccim=[]
i=1
for colorname in tkColorNames:
#load xpm , set backround color
self.xpmrect=BitmapImage(file=xxpm, background=colorname,foreground='black')
r,g,b=self.mainwindow.winfo_rgb(colorname)
rgbvalue=listrgb2hexrgb((r,g,b))
self.ccim.append(self .xpmrect)
self.tree.insert('','end',image = self.xpmrect,text=' ',value=(colorname, rgbvalue))
i+=1

Вот мы и получили программу из 82 строк включая пробелы. Теперь вы можете просматривать доступные имена для стандартных цветов и соответствующие им коды. Можно скачать исходный код примеров этой статьи
Ссылки
Моя заметка про pygubu-designer
