import tkinter as tk
from tkinter import colorchooser
import math
# ---------------------------------------
# WCAG Calculation Functions
# ---------------------------------------
def hex_to_rgb(hex_color):
hex_color = hex_color.lstrip("#")
return tuple(int(hex_color[i:i+2], 16) for i in (0, 2, 4))
def linearize(value):
value = value / 255
if value <= 0.03928:
return value / 12.92
else:
return ((value + 0.055) / 1.055) ** 2.4
def relative_luminance(rgb):
r, g, b = rgb
r = linearize(r)
g = linearize(g)
b = linearize(b)
return 0.2126 * r + 0.7152 * g + 0.0722 * b
def contrast_ratio(color1, color2):
L1 = relative_luminance(color1)
L2 = relative_luminance(color2)
lighter = max(L1, L2)
darker = min(L1, L2)
return (lighter + 0.05) / (darker + 0.05)
def wcag_result(ratio):
result = ""
if ratio >= 7:
result += "AAA (Normal Text) \n"
elif ratio >= 4.5:
result += "AA (Normal Text) \n"
else:
result += "Fails AA (Normal Text) \n"
if ratio >= 4.5:
result += "AAA (Large Text) \n"
elif ratio >= 3:
result += "AA (Large Text) \n"
else:
result += "Fails Large Text \n"
return result
# ---------------------------------------
# GUI
# ---------------------------------------
class ContrastChecker:
def __init__(self, root):
self.root = root
self.root.title("WCAG Color Contrast Checker")
self.root.geometry("500x400")
self.color1 = "#000000"
self.color2 = "#FFFFFF"
self.build_ui()
def build_ui(self):
tk.Label(self.root, text="Foreground Color").pack(pady=5)
tk.Button(self.root, text="Choose Color 1",
command=self.pick_color1).pack()
tk.Label(self.root, text="Background Color").pack(pady=5)
tk.Button(self.root, text="Choose Color 2",
command=self.pick_color2).pack()
tk.Button(self.root, text="Check Contrast",
command=self.check_contrast).pack(pady=15)
self.preview = tk.Label(self.root, text="Preview Text",
font=("Arial", 16))
self.preview.pack(pady=10)
self.result_label = tk.Label(self.root, text="", justify="left")
self.result_label.pack(pady=10)
def pick_color1(self):
color = colorchooser.askcolor()[1]
if color:
self.color1 = color
def pick_color2(self):
color = colorchooser.askcolor()[1]
if color:
self.color2 = color
def check_contrast(self):
rgb1 = hex_to_rgb(self.color1)
rgb2 = hex_to_rgb(self.color2)
ratio = contrast_ratio(rgb1, rgb2)
self.preview.config(
fg=self.color1,
bg=self.color2
)
result = f"Contrast Ratio: {ratio:.2f}:1\n\n"
result += wcag_result(ratio)
self.result_label.config(text=result)
# ---------------------------------------
# RUN
# ---------------------------------------
if __name__ == "__main__":
root = tk.Tk()
app = ContrastChecker(root)
root.mainloop()