В этой небольшой заметке я рассказываю про именованные цвета 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

BeautifulSoup4

Страница tcl.tk с кодами цветов

Исходный код примеров этой статьи