#!python # -*- mode: python; Encoding: utf-8; coding: utf-8 -*- # Last updated: <2024/05/22 06:31:06 +0900> """ PyAutoGUI、pynput、tkinter を使って、 デスクトップ上の一点をマウスクリックすると色を取得するサンプル。 ボタンを押したままマウスを動かして、ボタンを離した位置の色を取得する。 Windows10 x64 22H2 Python 3.10.10 64bit + PyAutoGUI 0.9.54 + pynput 1.7.6 """ import tkinter as tk import pyautogui from pynput import mouse import pyperclip DEF_MSG = "Drag here. Get color" listener = None getting = False def get_rgb(x, y): global rgblbl, rgbflbl, collbl r, g, b = pyautogui.screenshot().getpixel((x, y)) rf = float(r) / 255.0 gf = float(g) / 255.0 bf = float(b) / 255.0 rgbftext = "%.4f, %.4f, %.4f" % (rf, gf, bf) rgblbl.config(text="RGB : %d, %d, %d" % (r, g, b)) rgbflbl.config(text=rgbftext) collbl.config(bg="#%02x%02x%02x" % (r, g, b)) return rgbftext def on_move(x, y): get_rgb(x, y) def on_click(x, y, button, pressed): global listener, getting, btn, root if button == mouse.Button.left: if not pressed: # button release. to clipboard pyperclip.copy(get_rgb(x, y)) btn.config(text="Copied !") listener.stop() getting = False root.after(1000, set_default_msg) def set_default_msg(): global btn btn.config(text=DEF_MSG) def start_get_color(e): global listener, getting, btn, rgblbl listener = mouse.Listener(on_click=on_click, on_move=on_move) listener.start() btn.config(text="Please release on desktop") getting = True def close_window(e): global getting if getting: return root.destroy() # ---------------------------------------- # main # init tkinter root = tk.Tk() root.title("Color picker") # root.geometry("260x200") root.attributes("-topmost", True) btn = tk.Label( text=DEF_MSG, font=("Arial", 13), width=25, borderwidth=3, relief=tk.GROOVE ) rgblbl = tk.Label(root, text="RGB : 0, 0, 0") rgbflbl = tk.Label(root, text="0.0000, 0.0000, 0.0000") collbl = tk.Label( root, text="", width=20, height=4, bg="black", borderwidth=1, relief=tk.SOLID ) btn.pack(padx=8, pady=8) rgblbl.pack() rgbflbl.pack() collbl.pack(padx=8, pady=8) btn.bind("", start_get_color) root.bind("", close_window) root.bind("q", close_window) root.mainloop()