В этой небольшой заметке я рассказываю про именованные цвета 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
kompilainenn2
Было бы круто по двойному щелчку мышью на цвете получать в буфер обмена rgb этого цвета
piratarusso Автор
В принципе, ваша мысль довольно разумна. Если говорить про последнюю программу, то логично повесить копирование имени выбранного цвета в буфер по нажатию комбинации <ctrl - c>, или можно добавить кнопку на панель, которая будет при нажатии делать то же самое.
StreamThread
Плагин инструмента "Пипетка" для каждого популярного браузера существует.
piratarusso Автор
Пипетки вообще появляются регулярно и не только для браузеров. Только для Гнома я видел видел три штуки. Не знаю как объяснить этот процесс, но изготовление многочисленных пипеток стало довольно популярным занятием для программистов.
kompilainenn2
Спасибо, но йич реквест был для конкретно этой программки