55 votes

Table des couleurs pour Tkinter et Tix

J'ai voulu visualiser quelques couleurs de base, afin de pouvoir choisir les appropriées pour mon schéma chromatique. Je n'ai trouvé nulle part de nuancier de couleurs, donc j'ai modifié un échantillon pour l'afficher.

Est-ce une bonne méthode ?

import Tix as tk
# import tkinter.tix as tk # for Python 3

COLORS  =['neige', 'blanc fantôme', 'fumée blanche', 'gainsboro', 'blanc floral', 'dentelle ancienne',
    'lin', 'blanc antique', 'fouet de papaye', 'amande blanchie', 'bisque', 'pêche brûlée',
    'blanc navajo', 'chiffon de citron', 'crème de menthe', 'azur', 'bleu alice', 'lavande',
    'lavande rosée', 'rose brume', 'gris ardoise foncé', 'gris foncé', 'gris ardoise',
    'gris ardoise clair', 'gris', 'gris clair', 'bleu nuit', 'marine', 'bleuet', 'bleu ardoise foncé',
    'bleu ardoise', 'bleu ardoise moyen', 'bleu ardoise clair', 'bleu moyen', 'bleu royal',  'bleu',
    'bleu vif', 'bleu ciel profond', 'bleu ciel', 'bleu ciel clair', 'bleu acier', 'bleu acier clair',
    'bleu clair', 'bleu poudre', 'turquoise pâle', 'turquoise foncé', 'turquoise moyen', 'turquoise',
    'cya', 'cyan clair', 'bleu roi', 'aigue-marine moyen', 'aigue-marine', 'vert foncé', 'vert olive foncé',
    'vert mer foncé', 'vert mer', 'vert mer moyen', 'vert mer clair', 'vert pâle', 'vert printemps',
    'vert gazon', 'vert printemps moyen', 'vert jaune', 'vert luisant', 'vert jaune',
    'vert forêt', 'vert olive', 'kaki foncé', 'kaki', 'jonquille pâle', 'jaune clair doré',
    'jaune clair', 'jaune', 'or', 'jaune clair doré', 'rouge doré', 'doré', 'rouge doré foncé',
    'marron rosé', 'rouge indien', 'marron sellier', 'marron sable',
    'saumon foncé', 'saumon', 'saumon clair', 'orange', 'orange foncé',
    'corail', 'corail clair', 'tomate', 'rouge orangé', 'rouge', 'rose vif', 'rose foncé', 'rose', 'rose clair',
    'rose violacé pâle', 'marron', 'violet rouge moyen', 'violet rouge',
    'orchidée moyen', 'orchidée foncé', 'violet foncé', 'bleu violet', 'violet', 'violet moyen',
    'chardon', 'neige2', 'neige3',
    'neige4', 'écailles2', 'écailles3', 'écailles4', 'blanc antique 1', 'blanc antique 2',
    'blanc antique 3', 'blanc antique 4', 'bisque2', 'bisque3', 'bisque4', 'fouet de papaye2',
    'fouet de papaye3', 'fouet de papaye4', 'navajo blanc2', 'navajo blanc3', 'navajo blanc4',
    'chiffon de citron2', 'chiffon de citron3', 'chiffon de citron4', 'iris de maïs2', 'iris de maïs3',
    'iris de maïs4', 'ivoire2', 'ivoire3', 'ivoire4', 'melons2', 'melons3', 'melons4',
    'blush de lavande2', 'blush de lavande3', 'blush de lavande4', 'rose brume2', 'rose brume3',
    'rose brume4', 'azur2', 'azur3', 'azur4', 'Bleu ardoise 1', 'Bleu ardoise 2', 'Bleu ardoise 3',
    'Bleu ardoise 4', 'bleu royal 1', 'bleu royal 2', 'bleu royal 3', 'bleu royal 4', 'bleu2', 'bleu4',
    'bleu vif2', 'bleu vif3', 'bleu vif4', 'bleu acier 1', 'bleu acier 2',
    'bleu acier 3', 'bleu acier 4', 'bleu ciel profond 2', 'bleu ciel profond 3', 'bleu ciel profond 4',
    'bleu ciel 1', 'bleu ciel 2', 'bleu ciel 3', 'bleu ciel 4', 'bleu ciel clair 1', 'bleu ciel clair 2',
    'bleu ciel clair 3', 'bleu ciel clair 4', 'gris ardoise 1', 'gris ardoise 2', 'gris ardoise 3',
    'gris ardoise 4', 'bleu acier clair 1', 'bleu acier clair 2', 'bleu acier clair 3',
    'bleu acier clair 4', 'bleu clair 1', 'bleu clair 2', 'bleu clair 3', 'bleu clair 4',
    'cyan clair 2', 'cyan clair 3', 'cyan clair 4', 'turquoise pâle 1', 'turquoise pâle 2',
    'turquoise pâle 3', 'turquoise pâle 4', 'bleu roi 1', 'bleu roi 2', 'bleu roi 3',
    'bleu roi 4', 'cya2', 'cya3', 'cya4', 'gris ardoise foncé 1', 'gris ardoise foncé 2', 'gris ardoise foncé 3',
    'gris ardoise foncé 4', 'aigue-marine2', 'aigue-marine4', 'vert mer foncé 1', 'vert mer foncé 2', 'vert mer foncé 3',
    'vert mer foncé 4', 'vert mer 1', 'vert mer 2', 'vert mer 3', 'vert pâle 1', 'vert pâle 2',
    'vert pâle 3', 'vert pâle 4', 'vert printemps 2', 'vert printemps 3', 'vert printemps 4',
    'vert2', 'vert3', 'vert4', 'chartreuse2', 'chartreuse3', 'chartreuse4',
    'olive foncé 1', 'olive foncé 2', 'olive foncé 4', 'vert olive foncé 1', 'vert olive foncé 2',
    'vert olive foncé 3', 'vert olive foncé 4', 'kaki1', 'kaki2', 'kaki3', 'kaki4',
    'doré clair 1', 'doré clair 2', 'doré clair 3', 'doré clair 4',
    'jaune2', 'jaune3', 'jaune4', 'or2', 'or3', 'or4', 'rouge doré 1', 'rouge doré 2', 'rouge doré 3', 'rouge doré 4',
    'marron rosé 1', 'marron rosé 2', 'marron rosé 3', 'marron rosé 4', 'rouge indien 1', 'rouge indien 2',
    'rouge indien 3', 'rouge indien 4', 'bistre1', 'bistre2', 'bistre3', 'bistre4', 'blé1', 'blé2',
    'blé3', 'blé4', 'hâle1', 'hâle2', 'hâle4', 'chocolat1', 'chocolat2', 'chocolat3', 'brique1', 'brique2',
    'brique3', 'brique4', 'marron1', 'marron2', 'marron3', 'marron4', 'saumon1', 'saumon2',
    'saumon3', 'saumon4', 'saumon clair 2', 'saumon clair 3', 'saumon clair 4', 'orange2',
    'orange3', 'orange4', 'orange foncé 1', 'orange foncé 2', 'orange foncé 3', 'orange foncé 4',
    'corail1', 'corail2', 'corail3', 'corail4', 'tomate2', 'tomate3', 'tomate4', 'rouge orangé 2',
    'rouge orangé 3', 'rouge orangé 4', 'rouge2', 'rouge3', 'rouge4', 'rose foncé 2', 'rose foncé 3', 'rose foncé 4',
    'rose vif 1', 'rose vif 2', 'rose vif 3', 'rose vif 4', 'rose 1', 'rose 2', 'rose 3', 'rose 4',
    'rose clair 1', 'rose clair 2', 'rose clair 3', 'rose clair 4', 'rose violacé pâle 1',
    'rose violacé pâle 2', 'rose violacé pâle 3', 'rose violacé pâle 4', 'marron1', 'marron2',
    'marron3', 'marron4', 'violet rouge 1', 'violet rouge 2', 'violet rouge 3', 'violet rouge 4',
    'magenta2', 'magenta3', 'magenta4', 'orchidée1', 'orchidée2', 'orchidée3', 'orchidée4', 'prune1',
    'prune2', 'prune3', 'prune4', 'orchidée moyen1', 'orchidée moyen2', 'orchidée moyen3',
    'orchidée moyen4', 'orchidée foncé1', 'orchidée foncé2', 'orchidée foncé3', 'orchidée foncé4',
    'violet1', 'violet2', 'violet3', 'violet4', 'violet moyen 1', 'violet moyen 2',
    'violet moyen 3', 'violet moyen 4', 'chardon1', 'chardon2', 'chardon3', 'chardon4',
    'gris1', 'gris2', 'gris3', 'gris4', 'gris5', 'gris6', 'gris7', 'gris8', 'gris9', 'gris10',
    'gris11', 'gris12', 'gris13', 'gris14', 'gris15', 'gris16', 'gris17', 'gris18', 'gris19',
    'gris20', 'gris21', 'gris22', 'gris23', 'gris24', 'gris25', 'gris26', 'gris27', 'gris28',
    'gris29', 'gris30', 'gris31', 'gris32', 'gris33', 'gris34', 'gris35', 'gris36', 'gris37',
    'gris38', 'gris39', 'gris40', 'gris42', 'gris43', 'gris44', 'gris45', 'gris46', 'gris47',
    'gris48', 'gris49', 'gris50', 'gris51', 'gris52', 'gris53', 'gris54', 'gris55', 'gris56',
    'gris57', 'gris58', 'gris59', 'gris60', 'gris61', 'gris62', 'gris63', 'gris64', 'gris65',
    'gris66', 'gris67', 'gris68', 'gris69', 'gris70', 'gris71', 'gris72', 'gris73', 'gris74',
    'gris75', 'gris76', 'gris77', 'gris78', 'gris79', 'gris80', 'gris81', 'gris82', 'gris83',
    'gris84', 'gris85', 'gris86', 'gris87', 'gris88', 'gris89', 'gris90', 'gris91', 'gris92',
    'gris93', 'gris94', 'gris95', 'gris97', 'gris98', 'gris99']

def dessiner_cadres(_sw):
    for c in COLORS:
        e= tk.Label(sw.window, text = c, background = c)
        e.pack(fill = tk.X)

r= tk.Tk()
r.title("Nuancier de couleurs nommées")
sw= tk.ScrolledWindow(r, scrollbar=tk.BOTH)
sw.pack(fill=tk.BOTH, expand=1)

dessiner_cadres(sw)

r.mainloop()

1 votes

Cela serait plus utile si cela ne nécessitait pas de tix.

0 votes

Je utilise Tix pour dessiner une fenêtre avec défilement mais c'est tout. Pourquoi serait-il mieux si je n'utilisais pas Tix? Tix est-il ignoré dans la communauté Python?

0 votes

Ce serait mieux si les couleurs plus foncées avaient du texte blanc, car certaines (par exemple grey1) sont très difficiles à voir, mais je comprends que cela n'était pas censé être très complexe.

38voto

Jesse Crossen Points 3244

Pour ce que ça vaut, voici une version qui ne nécessite pas Tix. Il utilise un gestionnaire de grille pour que vous puissiez voir toutes les couleurs en même temps. Vous voudrez peut-être ajuster MAX_ROWS et FONT_SIZE pour votre affichage.

import tkinter as tk

COLORS = ['snow', 'ghost white', 'white smoke', 'gainsboro', 'floral white', 'old lace',
          'linen', 'antique white', 'papaya whip', 'blanched almond', 'bisque', 'peach puff',
          ...
          'gray95', 'gray97', 'gray98', 'gray99']

class ColorChart(tk.Frame):

    MAX_ROWS = 36
    FONT_SIZE = 10

    def __init__(self, root):
        tk.Frame.__init__(self, root)
        r = 0
        c = 0

        for color in COLORS:
            label = tk.Label(self, text=color, bg=color,
                             font=("Times", self.FONT_SIZE, "bold"))
            label.grid(row=r, column=c, sticky="ew")
            r += 1

            if r > self.MAX_ROWS:
                r = 0
                c += 1

        self.pack(expand=1, fill="both")

if __name__ == '__main__':
    root = tk.Tk()
    root.title("Tableau de couleurs nommées")
    app = ColorChart(root)
    root.mainloop()

12voto

schlenk Points 3480

Il existe également les noms de couleur officiels documentés dans la page de l'homme des couleurs pour Tk.

8voto

FabienAndre Points 1972

Que diriez-vous de lire les COULEURS à partir d'un fichier ?

import sys, os
rgb_path = [
    "/usr/share/X11/rgb.txt", #Linux
    "/usr/X11/share/X11/rgb.txt", #MacOS
    ]
COLORS = []
for filename in rgb_path:
    if os.path.exists(filename):
        with open(filename, 'r') as filedesc:
            for line in filedesc:
                if not (line.isspace() or line.startswith("#")):
                    # prendre la partie après le dernier \t rsplit("\t",[-1])
                    # et retirer le caractère de retour à la ligne [:-1]
                    COLORS.append(line.rsplit("\t",1)[-1][:-1])
        break

7voto

thodnev Points 950

Et voici ce véhicule réinventé. Il utilise sa propre implémentation du widget de cadre déroulant

from tkinter import *

class ScrolledFrame(Frame):
    def __init__(self, master=None, *args, **kwargs):
        top = Frame(master)  # create top frame, containing all things
        # attach scrollbars
        vscroll = Scrollbar(top)
        vscroll.pack(side='right', fill='y')
        hscroll = Scrollbar(top, orient='horizontal')
        hscroll.pack(side='bottom', fill='x')
        # hack: insert self into scrollable canvas
        canvas = Canvas(top, highlightthickness=0)
        canvas.pack(expand=True, fill='both')
        super().__init__(master=canvas, *args, **kwargs)  # create
        canvas.create_window(0,0, window=self,
                             anchor='nw', tags='frame')  # insert
        # add a hack to rebuild scrollable area size
        canvas.bind('<Configure>', self.__set_scroll)
        # cross-bind scrolling
        vscroll['command'] = canvas.yview
        canvas['yscrollcommand'] = vscroll.set
        hscroll['command'] = canvas.xview
        canvas['xscrollcommand'] = hscroll.set
        # attach hierarchically
        self._top = top
        self._top._vscroll = vscroll
        self._top._hscroll = hscroll
        self._top._canvas = canvas

    def pack(self, *args, **kwargs):
        '''
        A wrapper over tkinter's pack
        '''
        return self._top.pack(*args, **kwargs) # pack topmost

    def __set_scroll(self, event=None):
        canvas = self._top._canvas
        canvas.config(scrollregion=canvas.bbox('frame'))

def showcolors(colors):
    colors = colors[:]
    root = Tk()
    root.title('Tkinter colors showcase')
    Label(root, text='Double click to copy to clipboard').pack(fill='x')
    top = ScrolledFrame(root)
    colnum = int((len(colors)/3) ** 0.5)
    row = 0
    while colors:
        chunk, colors = colors[:colnum], colors[colnum:]
        for col, color in enumerate(chunk):
            lab = Label(top, text=color, bg=color)
            lab.grid(row=row, column=col, sticky='wens')
            lab.bind('<Double-1>', _clipboard_copy(lab))
            lab.bind('<Enter>', lambda ev, lab=lab: lab.config(fg='white'))
            lab.bind('<Leave>', lambda ev, lab=lab: lab.config(fg='black'))
        row += 1
    top.pack(expand=True, fill='both')
    root.mainloop()

def _clipboard_copy(inst):
    def wrapper(event):
        inst.clipboard_clear()
        inst.clipboard_append(inst['text'])
    return wrapper

COLORS = ['snow', 'ghost white', 'white smoke', 'gainsboro', 'floral white', 'old lace',
          'linen', 'antique white', 'papaya whip', 'blanched almond', 'bisque', 'peach puff',
          'navajo white', 'lemon chiffon', 'mint cream', 'azure', 'alice blue', 'lavender',
          'lavender blush', 'misty rose', 'dark slate gray', 'dim gray', 'slate gray',
          'light slate gray', 'gray', 'light grey', 'midnight blue', 'navy', 'cornflower blue', 'dark slate blue',
          'slate blue', 'medium slate blue', 'light slate blue', 'medium blue', 'royal blue',  'blue',
          'dodger blue', 'deep sky blue', 'sky blue', 'light sky blue', 'steel blue', 'light steel blue',
          'light blue', 'powder blue', 'pale turquoise', 'dark turquoise', 'medium turquoise', 'turquoise',
          'cyan', 'light cyan', 'cadet blue', 'medium aquamarine', 'aquamarine', 'dark green', 'dark olive green',
          'dark sea green', 'sea green', 'medium sea green', 'light sea green', 'pale green', 'spring green',
          'lawn green', 'medium spring green', 'green yellow', 'lime green', 'yellow green',
          'forest green', 'olive drab', 'dark khaki', 'khaki', 'pale goldenrod', 'light goldenrod yellow',
          'light yellow', 'yellow', 'gold', 'light goldenrod', 'goldenrod', 'dark goldenrod', 'rosy brown',
          'indian red', 'saddle brown', 'sandy brown',
          'dark salmon', 'salmon', 'light salmon', 'orange', 'dark orange',
          'coral', 'light coral', 'tomato', 'orange red', 'red', 'hot pink', 'deep pink', 'pink', 'light pink',
          'pale violet red', 'maroon', 'medium violet red', 'violet red',
          'medium orchid', 'dark orchid', 'dark violet', 'blue violet', 'purple', 'medium purple',
          'thistle', 'snow2', 'snow3',
          'snow4', 'seashell2', 'seashell3', 'seashell4', 'AntiqueWhite1', 'AntiqueWhite2',
          'AntiqueWhite3', 'AntiqueWhite4', 'bisque2', 'bisque3', 'bisque4', 'PeachPuff2',
          'PeachPuff3', 'PeachPuff4', 'NavajoWhite2', 'NavajoWhite3', 'NavajoWhite4',
          'LemonChiffon2', 'LemonChiffon3', 'LemonChiffon4', 'cornsilk2', 'cornsilk3',
          'cornsilk4', 'ivory2', 'ivory3', 'ivory4', 'honeydew2', 'honeydew3', 'honeydew4',
          'LavenderBlush2', 'LavenderBlush3', 'LavenderBlush4', 'MistyRose2', 'MistyRose3',
          'MistyRose4', 'azure2', 'azure3', 'azure4', 'SlateBlue1', 'SlateBlue2', 'SlateBlue3',
          'SlateBlue4', 'RoyalBlue1', 'RoyalBlue2', 'RoyalBlue3', 'RoyalBlue4', 'blue2', 'blue4',
          'DodgerBlue2', 'DodgerBlue3', 'DodgerBlue4', 'SteelBlue1', 'SteelBlue2',
          'SteelBlue3', 'SteelBlue4', 'DeepSkyBlue2', 'DeepSkyBlue3', 'DeepSkyBlue4',
          'SkyBlue1', 'SkyBlue2', 'SkyBlue3', 'SkyBlue4', 'LightSkyBlue1', 'LightSkyBlue2',
          'LightSkyBlue3', 'LightSkyBlue4', 'SlateGray1', 'SlateGray2', 'SlateGray3',
          'SlateGray4', 'LightSteelBlue1', 'LightSteelBlue2', 'LightSteelBlue3',
          'LightSteelBlue4', 'LightBlue1', 'LightBlue2', 'LightBlue3', 'LightBlue4',
          'LightCyan2', 'LightCyan3', 'LightCyan4', 'PaleTurquoise1', 'PaleTurquoise2',
          'PaleTurquoise3', 'PaleTurquoise4', 'CadetBlue1', 'CadetBlue2', 'CadetBlue3',
          'CadetBlue4', 'turquoise1', 'turquoise2', 'turquoise3', 'turquoise4', 'cyan2', 'cyan3',
          'cyan4', 'DarkSlateGray1', 'DarkSlateGray2', 'DarkSlateGray3', 'DarkSlateGray4',
          'aquamarine2', 'aquamarine4', 'DarkSeaGreen1', 'DarkSeaGreen2', 'DarkSeaGreen3',
          'DarkSeaGreen4', 'SeaGreen1', 'SeaGreen2', 'SeaGreen3', 'PaleGreen1', 'PaleGreen2',
          'PaleGreen3', 'PaleGreen4', 'SpringGreen2', 'SpringGreen3', 'SpringGreen4',
          'green2', 'green3', 'green4', 'chartreuse2', 'chartreuse3', 'chartreuse4',
          'OliveDrab1', 'OliveDrab2', 'OliveDrab4', 'DarkOliveGreen1', 'DarkOliveGreen2',
          'DarkOliveGreen3', 'DarkOliveGreen4', 'khaki1', 'khaki2', 'khaki3', 'khaki4',
          'LightGoldenrod1', 'LightGoldenrod2', 'LightGoldenrod3', 'LightGoldenrod4',
          'LightYellow2', 'LightYellow3', 'LightYellow4', 'yellow2', 'yellow3', 'yellow4',
          'gold2', 'gold3', 'gold4', 'goldenrod1', 'goldenrod2', 'goldenrod3', 'goldenrod4',
          'DarkGoldenrod1', 'DarkGoldenrod2', 'DarkGoldenrod3', 'DarkGoldenrod4',
          'RosyBrown1', 'RosyBrown2', 'RosyBrown3', 'RosyBrown4', 'IndianRed1', 'IndianRed2',
          'IndianRed3', 'IndianRed4', 'sienna1', 'sienna2', 'sienna3', 'sienna4', 'burlywood1',
          'burlywood2', 'burlywood3', 'burlywood4', 'wheat1', 'wheat2', 'wheat3', 'wheat4', 'tan1',
          'tan2', 'tan4', 'chocolate1', 'chocolate2', 'chocolate3', 'firebrick1', 'firebrick2',
          'firebrick3', 'firebrick4', 'brown1', 'brown2', 'brown3', 'brown4', 'salmon1', 'salmon2',
          'salmon3', 'salmon4', 'LightSalmon2', 'LightSalmon3', 'LightSalmon4', 'orange2',
          'orange3', 'orange4', 'DarkOrange1', 'DarkOrange2', 'DarkOrange3', 'DarkOrange4',
          'coral1', 'coral2', 'coral3', 'coral4', 'tomato2', 'tomato3', 'tomato4', 'OrangeRed2',
          'OrangeRed3', 'OrangeRed4', 'red2', 'red3', 'red4', 'DeepPink2', 'DeepPink3', 'DeepPink4',
          'HotPink1', 'HotPink2', 'HotPink3', 'HotPink4', 'pink1', 'pink2', 'pink3', 'pink4',
          'LightPink1', 'LightPink2', 'LightPink3', 'LightPink4', 'PaleVioletRed1',
          'PaleVioletRed2', 'PaleVioletRed3', 'PaleVioletRed4', 'maroon1', 'maroon2',
          'maroon3', 'maroon4', 'VioletRed1', 'VioletRed2', 'VioletRed3', 'VioletRed4',
          'magenta2', 'magenta3', 'magenta4', 'orchid1', 'orchid2', 'orchid3', 'orchid4', 'plum1',
          'plum2', 'plum3', 'plum4', 'MediumOrchid1', 'MediumOrchid2', 'MediumOrchid3',
          'MediumOrchid4', 'DarkOrchid1', 'DarkOrchid2', 'DarkOrchid3', 'DarkOrchid4',
          'purple1', 'purple2', 'purple3', 'purple4', 'MediumPurple1', 'MediumPurple2',
          'MediumPurple3', 'MediumPurple4', 'thistle1', 'thistle2', 'thistle3', 'thistle4',
          'gray1', 'gray2', 'gray3', 'gray4', 'gray5', 'gray6', 'gray7', 'gray8', 'gray9', 'gray10',
          'gray11', 'gray12', 'gray13', 'gray14', 'gray15', 'gray16', 'gray17', 'gray18', 'gray19',
          'gray20', 'gray21', 'gray22', 'gray23', 'gray24', 'gray25', 'gray26', 'gray27', 'gray28',
          'gray29', 'gray30', 'gray31', 'gray32', 'gray33', 'gray34', 'gray35', 'gray36', 'gray37',
          'gray38', 'gray39', 'gray40', 'gray42', 'gray43', 'gray44', 'gray45', 'gray46', 'gray47',
          'gray48', 'gray49', 'gray50', 'gray51', 'gray52', 'gray53', 'gray54', 'gray55', 'gray56',
          'gray57', 'gray58', 'gray59', 'gray60', 'gray61', 'gray62', 'gray63', 'gray64', 'gray65',
          'gray66', 'gray67', 'gray68', 'gray69', 'gray70', 'gray71', 'gray72', 'gray73', 'gray74',
          'gray75', 'gray76', 'gray77', 'gray78', 'gray79', 'gray80', 'gray81', 'gray82', 'gray83',
          'gray84', 'gray85', 'gray86', 'gray87', 'gray88', 'gray89', 'gray90', 'gray91', 'gray92',
          'gray93', 'gray94', 'gray95', 'gray97', 'gray98', 'gray99']

if __name__ == '__main__':
    showcolors(COLORS)

C'est un peu comme la vitrine de Tcl/Tk, mais en python) Tkinter colors showcase

3voto

JCKE Points 225

Intégrant certaines des autres réponses dans une version définitive avec :

  • défilement ;
  • copie du code hexadécimal de la couleur dans le presse-papiers ;
  • utilisation d'une liste de couleurs intégrée ;
  • texte blanc sur des couleurs sombres ;
  • ajustement pour les écrans modernes haute résolution (DPI) ;

La page man officielle sur les couleurs tkinter est dérivée des noms de couleurs X11, et une version devrait être incluse dans votre installation de python sous %PYTHONPATH%/Tools/pynche/X/rgb.txt. Voici une explication détaillée sur les formules utilisées pour calculer une couleur de texte appropriée basée sur le contraste et la luminance.

import tkinter as tk
from Tools.pynche import ColorDB
import os
import colorsys

rgb_file = os.path.join(os.path.dirname(ColorDB.__file__), 'X', 'rgb.txt')
rgb_db = ColorDB.get_colordb(rgb_file)
colors = [x.lower().replace(' ', '') for x in rgb_db.unique_names()]

# Séparer les couleurs en niveaux de gris rend le code plus clair
grayscale = []
for v in ['black'] + ['gray{}'.format(i) for i in range(0, 101)] + ['white']:
    if v in colors:
        colors.remove(v)
        grayscale.append(v)
colors.sort(key=lambda x: colorsys.rgb_to_hls(*rgb_db.find_byname(x)))
colors = grayscale + colors

# Utiliser du blanc sur des couleurs sombres, noir sur des claires
def calculateContrast(color):
    # Conversion en 8 bits à partir de 16 bits, et division par 255 (255 * 256 = 65280)
    rgb = [c / 65280 for c in color]
    r, g, b = [(c / 12.92) if c <= 0.03928 else
               ((c + 0.055) / 1.055) ** 2.4 for c in rgb]
    luminance = 0.2126 * r + 0.7152 * g + 0.0722 * b
    if luminance > 0.179:
        return '#000000'
    else:
        return '#ffffff'

class ColorGrid(tk.Frame):
    def __init__(self, root):
        super().__init__(root)
        self.canvas = tk.Canvas(root)
        self.frame = tk.Frame(self.canvas)
        self.scroll = tk.Scrollbar(root, orient=tk.VERTICAL,
                                   command=self.canvas.yview)
        self.canvas.grid(row=0, column=0, sticky='nsew')
        self.scroll.grid(row=0, column=1, sticky='nsw')
        self.canvas.create_window(0, 0, window=self.frame, anchor='nw')
        root.grid_rowconfigure(0, weight=1)
        root.grid_columnconfigure(0, weight=1)
        self.canvas.bind('', self._onFrameConfigure)

        columns = 8
        rows = len(colors) // columns + 1
        max_width = len(max(colors, key=lambda x: len(x)))
        for i, color in enumerate(colors):
            fg_color = calculateContrast(root.winfo_rgb(color))
            # Pseudo-label, permet de changer facilement la couleur de la bordure
            entry = tk.Entry(self.frame, width=max_width, justify=tk.CENTER,
                             relief=tk.FLAT, disabledbackground=color,
                             disabledforeground=fg_color, cursor='arrow',
                             highlightbackground=color, highlightthickness=3)
            entry.insert(0, color)
            entry.config(state='disabled')
            entry.grid(row=i % rows, column=i // rows, sticky="ew")
            entry.bind('', self._clipboard_copy)
            entry.bind('', lambda event, widget=entry: widget.config(
                       highlightbackground=widget['disabledforeground']))
            entry.bind('', lambda event, widget=entry: widget.config(
                       highlightbackground=widget['disabledbackground']))

        self.canvas.update()
        new_height = min(self.winfo_screenheight() * 2 // 3,
                         self.canvas.bbox('all')[3])
        self.canvas.config(width=self.canvas.bbox('all')[2],
                           yscrollcommand=self.scroll.set, height=new_height)
        self.canvas.bind_all('', lambda event:
                             self.canvas.yview_scroll(int(-1 * event.delta),
                                                      'units'))

    # Copier le code hexadécimal dans le presse-papiers
    def _clipboard_copy(self, event):
        entry = event.widget
        rgb_tuple = self.winfo_rgb(entry.get())
        hex_code = '#{:02x}{:02x}{:02x}'.format(*[i // 256 for i in rgb_tuple])
        self.clipboard_clear()
        self.clipboard_append(hex_code)

    def _onFrameConfigure(self, event):
        self.canvas.config(scrollregion=self.canvas.bbox('all'))

if __name__ == '__main__':
    # Meilleure lisibilité sur des écrans haute résolution (DPI)
    try:
        from ctypes import windll
        windll.shcore.SetProcessDpiAwareness(1)
    except Exception:
        pass
    root = tk.Tk()
    root.title("Tableau des Couleurs Nominales")
    ColorGrid(root).grid(row=0, column=0, sticky='nsew')
    root.mainloop()

0 votes

Je ne peux pas dire pour d'autres distributions, mais pour la distribution Debian testing actuelle, j'ai dû installer le paquet python3-examples et ensuite ajouter PYTHONPATH=$PYTHONPATH:/usr/share/doc/python3.9/examples/ à mes variables d'environnement (essayant de réduire au maximum l'impact de cette nouvelle variable de chemin) et enfin remplacer la ligne from Tools.pynche import ColorDB par from pynche import ColorDB au début du code.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X