16進数のカラーコードを RGBコードに一括で変更するアプリ

2024年4月28日

Python のコード

import tkinter as tk
from tkinter import ttk
from tkinter import colorchooser

def color_changed():
    # カラーピッカーから選択された色を取得
#    selected_color = colorchooser.askcolor()[1]
    selected_color = colorchooser.askcolor(color=color_entry.get(), title="Select a color")[1]

    # ラベルに選択された色を設定
    color_label.config(style="ColorLabel.TLabel", background=selected_color)
    # RGB値をスライダーに反映
    r_scale.set(int(selected_color[1:3], 16))
    g_scale.set(int(selected_color[3:5], 16))
    b_scale.set(int(selected_color[5:7], 16))
    # カラーコードをエントリーボックスに反映
    color_entry.delete(0, tk.END)
    color_entry.insert(0, selected_color)

def update_color(event=None):
    # スライダーからRGB値を取得し、整数に変換
    r = int(r_scale.get())
    g = int(g_scale.get())
    b = int(b_scale.get())
    # カラーコードを作成
    color_code = "#{:02X}{:02X}{:02X}".format(r, g, b)
    # ラベルに選択された色を設定
    color_label.config(style="ColorLabel.TLabel", background=color_code)
    # カラーコードをエントリーボックスに反映
    color_entry.delete(0, tk.END)
    color_entry.insert(0, color_code)
    # RGB値をエントリーボックスに反映
    r_entry.configure(state='normal')
    g_entry.configure(state='normal')
    b_entry.configure(state='normal')

    r_entry.delete(0, tk.END)
    r_entry.insert(0, str(r))
    g_entry.delete(0, tk.END)
    g_entry.insert(0, str(g))
    b_entry.delete(0, tk.END)
    b_entry.insert(0, str(b))
    r_entry.configure(state='readonly')
    g_entry.configure(state='readonly')
    b_entry.configure(state='readonly')

def convert_color():
    # スクロール可能なテキストボックスから入力されたカラーコードを取得
    hex_colors = text_box1.get("1.0", "end").splitlines()
    # 各カラーコードについて変換を行い、結果を右側のテキストボックスに表示
    result = []
    for hex_color in hex_colors:
        # 入力がカラーコードの形式に従っていることを確認
        if len(hex_color) == 7 and hex_color[0] == '#':
            try:
                # 16進数をRGBに変換してカラーコードを生成
                rgb_color = tuple(int(hex_color[i:i+2], 16) for i in (1, 3, 5))
                rgb_code =  ",".join(map(str, rgb_color))  
                result.append(rgb_code)
            except ValueError:
                result.append("Invalid Color Code")
        else:
            result.append("Invalid Color Code")
    # 右側のテキストボックスに変換結果を表示
    text_box2.delete("1.0", "end")
    text_box2.insert("1.0", "\n".join(result))
    # 背景色を変更
    change_background_color()

def change_background_color():
    # スクロール可能なテキストボックスから入力されたカラーコードを取得
    hex_colors = text_box1.get("1.0", "end").splitlines()
    for i, hex_color in enumerate(hex_colors):
        # 入力がカラーコードの形式に従っていることを確認
        if len(hex_color) == 7 and hex_color[0] == '#':
            try:
                # 16進数をRGBに変換してカラーコードを生成
                rgb_color = tuple(int(hex_color[i:i+2], 16) for i in (1, 3, 5))
                rgb_code =  ",".join(map(str, rgb_color))
                # 背景色を変更
                text_box1.tag_config(f"line{i}", background=hex_color)
                text_box1.tag_add(f"line{i}", f"{i+1}.0", f"{i+1}.end")
            except ValueError:
                pass

def convert_color2():
    # スクロール可能なテキストボックスから入力されたカラーコードを取得
    rgb_colors = text_box2.get("1.0", "end").splitlines()
    # 各カラーコードについて変換を行い、結果を右側のテキストボックスに表示
    result = []
    for rgb_color in rgb_colors:
        # 入力がカラーコードの形式に従っていることを確認

        str_list = rgb_color.split(",") 
        str_list = list(map(int, str_list))

        if len(str_list) == 3:
            try:
                # 16進数をRGBに変換してカラーコードを生成
                hex_code = "#{:02x}{:02x}{:02x}".format(*str_list)
                result.append(hex_code)
            except ValueError:
                result.append("Invalid Color Code")
        else:
            result.append("Invalid Color Code")
    # 右側のテキストボックスに変換結果を表示
    text_box1.delete("1.0", "end")
    text_box1.insert("1.0", "\n".join(result))
    # 背景色を変更
    change_background_color()
# Tkinterウィンドウを作成
root = tk.Tk()
root.title("Color Picker and Converter")

# スタイルを作成してラベルに適用
style = ttk.Style(root)
style.configure("ColorLabel.TLabel", background="white")

paned_window = tk.PanedWindow(root)
paned_window.grid()

paned_window2 = tk.PanedWindow(root)
paned_window2.grid()

# 上部のFrame
upper_frame = ttk.LabelFrame(root, text="Color Picker")
upper_frame.grid(row=0, column=0, padx=5, pady=5, sticky="nsew")

# 下部のFrame
lower_frame = ttk.LabelFrame(root, text="Color Converter")
lower_frame.grid(row=1, column=0, padx=5, pady=5, sticky="nsew")
paned_window.add(upper_frame)
paned_window2.add(lower_frame)

# カラーピッカーボタンを作成
color_picker_button = ttk.Button(upper_frame, text="Pick a Color", command=color_changed)
color_picker_button.grid(row=0, column=0, padx=5, pady=5)

# カラーピッカーラベルを作成
color_label = ttk.Label(upper_frame, text="Selected Color", style="ColorLabel.TLabel", width=20, relief="solid")
color_label.grid(row=0, column=1, padx=5, pady=5)

# フレームを作成
upper_frame2 = ttk.Frame(upper_frame)
upper_frame2.grid(row=1, column=0, columnspan=2, padx=5, pady=5)

# RGB値のスライダーを作成
r_scale = ttk.Scale(upper_frame2, from_=0, to=255, length=200, command=update_color)
r_scale.grid(row=0, column=0, padx=5, pady=5)
g_scale = ttk.Scale(upper_frame2, from_=0, to=255, length=200, command=update_color)
g_scale.grid(row=1, column=0, padx=5, pady=5)
b_scale = ttk.Scale(upper_frame2, from_=0, to=255, length=200, command=update_color)
b_scale.grid(row=2, column=0, padx=5, pady=5)

# RGB値の表示エントリーボックスを作成
r_entry = ttk.Entry(upper_frame2, width=5, textvariable=tk.StringVar())
r_entry.grid(row=0, column=1, padx=5, pady=5)
g_entry = ttk.Entry(upper_frame2, width=5, textvariable=tk.StringVar())
g_entry.grid(row=1, column=1, padx=5, pady=5)
b_entry = ttk.Entry(upper_frame2, width=5, textvariable=tk.StringVar())
b_entry.grid(row=2, column=1, padx=5, pady=5)


# カラーコードのエントリーボックスを作成
color_entry = ttk.Entry(upper_frame, textvariable=tk.StringVar())
color_entry.grid(row=2, column=0, columnspan=2, padx=5, pady=5)

# カラーコード変換ボタンを作成
convert_button = ttk.Button(lower_frame, text="Convert->", command=convert_color)
convert_button.grid(row=0, column=0, columnspan=2, padx=5, pady=5)

convert_button2 = ttk.Button(lower_frame, text="<-Convert", command=convert_color2)
convert_button2.grid(row=0, column=3, columnspan=2, padx=5, pady=5)

# スクロール可能なテキストボックスを作成(上側)
color_label1 = ttk.Label(lower_frame, text="Hex Color", style="ColorLabel.TLabel", width=20, relief="solid")
color_label1.grid(row=1, column=0, padx=5, pady=5)

text_box1 = tk.Text(lower_frame, wrap="word", height=20, width=15)
text_box1.grid(row=2, column=0, padx=5, pady=5, columnspan=2, sticky="nsew")
scrollbar1 = ttk.Scrollbar(lower_frame, command=text_box1.yview)
scrollbar1.grid(row=2, column=2, sticky="ns")
text_box1.config(yscrollcommand=scrollbar1.set)

# スクロール可能なテキストボックスを作成(下側)
color_label2 = ttk.Label(lower_frame, text="RGB Color", style="ColorLabel.TLabel", width=20, relief="solid")
color_label2.grid(row=1, column=3, padx=5, pady=5)
text_box2 = tk.Text(lower_frame, wrap="word", height=20, width=15)
text_box2.grid(row=2, column=3, padx=5, pady=5, columnspan=2, sticky="nsew")
scrollbar2 = ttk.Scrollbar(lower_frame, command=text_box2.yview)
scrollbar2.grid(row=2, column=5, sticky="ns")
text_box2.config(yscrollcommand=scrollbar2.set)

r_entry.configure(state='readonly')
g_entry.configure(state='readonly')
b_entry.configure(state='readonly')

update_color(event=None)

# GUIを表示
root.mainloop()

Python

Posted by eightban