#!/usr/bin/env python3
from tkinter import *
from sys import argv
# .................................................. Global variables
RunAll=DrawColor=DrawSliders=True
ChangeEntries=GetData=MouseChange=False
GrabRed=GrabGreen=GrabBlue=False
cols='#ffffff'
red=255
green=255
blue=255
delay=20
xr=10
xg=31
xb=52
dx=10
EntryWidth=5
# .................................................. Button Functions
def StopAll():
  global RunAll
  RunAll=False
  # .................
def ReadData(*arg):
  global GetData
  GetData=True
# ................................................... Mouse Functions
def GrabSlider(event):
  global GrabRed,GrabGreen,GrabBlue,xr,xb,xg,red,green,blue,ch2
  GrabRed=((xr-event.x)**2+(ch2-red-event.y)**2)<100
  if not GrabRed:
    GrabGreen=((xg-event.x)**2+(ch2-green-event.y)**2)<100
  if not (GrabRed or GrabGreen):
    GrabBlue=((xb-event.x)**2+(ch2-blue-event.y)**2)<100
# ......................................................
def FreeSlider(event):
  global GrabRed,GrabGreen,GrabBlue,MouseChange,red,green,blue,cols
  MouseChange=True
  if red>255:
    red=255
  if green>255:
    green=255
  if blue>255:
    blue=255
  cols='#'+format(red,'02x')+format(green,'02x')+format(blue,'02x')
  GrabRed=GrabGreen=GrabBlue=False
# .................................................
def DragSlider(event):
  global GrabRed,GrabGreen,GrabBlue,xr,xb,xg,red,green,blue,ch2,cols
  if GrabRed:
    red=ch2-event.y
  elif GrabGreen:
    green=ch2-event.y
  elif GrabBlue:
    blue=ch2-event.y
  if red>255:
    red=255
  elif red<0:
    red=0
  if green>255:
    green=255
  elif green<0:
    green=0
  if blue>255:
    blue=255
  elif blue<0:
    blue=0
  cols='#'+format(red,'02x')+format(green,'02x')+format(blue,'02x')
# .................................................................
root=Tk()
root.title('rgb Color')
root.bind('<Return>',ReadData)
# .......................................................... Canvas 1
cw1=400
ch1=256
canvas1=Canvas(root, width=cw1, height=ch1, background='white')
canvas1.grid(row=0,column=0)
# .......................................................... Canvas 2
cw2=62
ch2=256
canvas2=Canvas(root, width=cw2, height=ch2, background='white')
canvas2.grid(row=0,column=1)
canvas2.bind("<Button-1>",GrabSlider)
canvas2.bind("<B1-Motion>",DragSlider)
canvas2.bind("<ButtonRelease-1>",FreeSlider)
# ........................................................... Toolbar
toolbar=Frame(root)
toolbar.grid(row=0,column=2,sticky=N)
# ........................................................... Buttons
nr=0
CloseButton=Button(toolbar, text="Exit", command=StopAll,width=7)
CloseButton.grid(row=nr,column=0)
nr+=1
# ........................................................... Entries
LabRed=Label(toolbar,text='Red',fg='red',font=("Helvetica",12))
LabRed.grid(row=nr,column=0)
EntryRed=Entry(toolbar,bd=5,width=EntryWidth)
EntryRed.grid(row=nr,column=1)
EntryRed.insert(0,str(red))
nr+=1
LabGreen=Label(toolbar,text='Green',fg='green',font=("Helvetica",12))
LabGreen.grid(row=nr,column=0)
EntryGreen=Entry(toolbar,bd=5,width=EntryWidth)
EntryGreen.grid(row=nr,column=1)
EntryGreen.insert(0,str(green))
nr+=1
LabBlue=Label(toolbar,text='Blue',fg='blue',font=("Helvetica",12))
LabBlue.grid(row=nr,column=0)
EntryBlue=Entry(toolbar,bd=5,width=EntryWidth)
EntryBlue.grid(row=nr,column=1)
EntryBlue.insert(0,str(blue))
nr+=1
ColorLab=Label(toolbar,text=cols,font=('Helvetica',12))
ColorLab.grid(row=nr,column=1,sticky=W)
# ......................................................... Main Loop
while RunAll:
  if DrawColor:
    canvas1.delete(ALL)
    canvas1.configure(background=cols)
    canvas1.update()
    canvas1.after(delay)
    #DrawColor=False
  #  ................................................... draw sliders
  canvas2.delete(ALL)
  canvas2.create_rectangle(xr-dx,ch2-red,xr+dx,ch2,fill='#ff0000')
  canvas2.create_rectangle(xg-dx,ch2-green,xg+dx,ch2,fill='#00ff00')
  canvas2.create_rectangle(xb-dx,ch2-blue,xb+dx,ch2,fill='#0000ff')
  canvas2.update()
  canvas2.after(delay)
  if GetData:
    try:
      red=int(EntryRed.get())
    except ValueError:
      pass
    try:
      green=int(EntryGreen.get())
    except ValueError:
      pass
    try:
      blue=int(EntryBlue.get())
    except ValueError:
      pass
    if red<0:
      red=0
    elif red>255:
      red=255
    if green<0:
      green=0
    elif green>255:
      green=255
    if blue<0:
      blue=0
    elif blue>255:
      blue=255
    cols='#'+format(red,'02x')+format(green,'02x')+format(blue,'02x')
    ChangeEntries=True
    GetData=False
  if MouseChange:
    ChangeEntries=True
    MouseChange=False
  if ChangeEntries:
    EntryRed.delete(0,'end')
    EntryRed.insert(0,'%3i'%red)
    EntryGreen.delete(0,'end')
    EntryGreen.insert(0,'%3i'%green)
    EntryBlue.delete(0,'end')
    EntryBlue.insert(0,'%3i'%blue)
    ColorLab['text']=cols
    DrawColor=True
    ChangeEntries=False
    
# ...................................................................
root.destroy()
root.mainloop()
  
