colorpicker.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. import tkinter as tk
  2. def r():
  3. canvas=tk.Canvas(xframe,width=600,height=100)
  4. canvas["bg"] = "yellow" #"green"
  5. canvas.pack()
  6. # RGB
  7. x=0
  8. y=0
  9. j=0
  10. d = 20
  11. f = 255 #255-fi
  12. e = 5
  13. for r in range(0,d+1):
  14. fi = int(r*255/d)
  15. color = '#%02x%02x%02x' % (f, fi, fi)
  16. print( "farbe", r*10, j, f,fi,fi,color)
  17. r = canvas.create_rectangle(x, y, x+20, y+20, fill=color)
  18. x+=20
  19. def hex_to_rgb(hex):
  20. return tuple(int(hex[i:i+2], 16) for i in (0, 2, 4))
  21. def _cb(event,data={}):
  22. print("dummy cb",event)
  23. class cb():
  24. def __init__(self,win,cb=None,scale=None):
  25. self.scale=scale
  26. self.win = win
  27. self.int_color = [255,255,255]
  28. if cb:
  29. self.cb = cb
  30. else:
  31. self.cb = _cb
  32. def _callback(self,event):
  33. clobj=event.widget
  34. ## undermouse=find_withtag(master.CURRENT)
  35. undermouse=self.win.find_closest(self.win.CURRENT)
  36. print( "colorpicker._callback",repr(undermouse))
  37. def callback(self,event):
  38. cnv = self.win
  39. try:
  40. item = cnv.find_closest(cnv.canvasx(event.x), cnv.canvasy(event.y))[0]
  41. tags = cnv.gettags(item)
  42. #cnv.itemconfigure(self.tag, text=tags[0])
  43. print("colorpicker callback",tags,item)
  44. color = cnv.itemcget(item, "fill")
  45. cnv.itemconfig("all", width=1)#filla="green")
  46. cnv.itemconfig(item, width=3)#filla="green")
  47. print("picker",color)
  48. self.int_color= hex_to_rgb(color[1:])
  49. except AttributeError as e:
  50. print("except colorpicker ",e)
  51. print("take old last",self.int_color)
  52. print("picker",self.int_color)
  53. int_color2 = []
  54. for c in self.int_color:
  55. if self.scale is not None:
  56. x = int(c *self.scale.get()/99)
  57. print(c,x)
  58. int_color2.append(x)
  59. else:
  60. int_color2.append(c)
  61. self.cb(event,{"canvas":cnv,"color":int_color2})
  62. def colorpicker(xframe,width=500,height=100,xcb=None):
  63. canvas=tk.Canvas(xframe,width=width,height=height)
  64. canvas["bg"] = "grey" #"green"
  65. _scale = tk.Scale(xframe,repeatdelay=1000,resolution=5,showvalue=0,bg="black", width=10,length=110,from_=99,to=0)##,command=self.event)
  66. _scale.set(255)
  67. _callback = cb(canvas,xcb,_scale)
  68. #canvas.bind("<Key>", key)
  69. canvas.bind("<Key>", _callback.callback)
  70. canvas.bind("<Button-1>", _callback.callback)
  71. canvas.bind("<Button-2>", _callback.callback)
  72. canvas.bind("<Button-3>", _callback.callback)
  73. canvas.bind("<Button-4>", _callback.callback)
  74. canvas.bind("<Button-5>", _callback.callback)
  75. canvas.bind("<B1-Motion>", _callback.callback)
  76. canvas.bind("<B2-Motion>", _callback.callback)
  77. canvas.bind("<B3-Motion>", _callback.callback)
  78. canvas.bind("<B4-Motion>", _callback.callback)
  79. canvas.bind("<B5-Motion>", _callback.callback)
  80. canvas.pack(side="left")
  81. def scale_callback(data=[]):
  82. #_last_scale = time.time()
  83. print("scale_callback",data)
  84. _callback.callback(None) #data)
  85. #_scale.config(command=_callback.callback)
  86. _scale.config(command=scale_callback)
  87. _scale.pack(side="left")
  88. x=2
  89. y=2
  90. d = 3
  91. r=0
  92. g=1
  93. b=1
  94. mode = 0
  95. count = 0
  96. grey = 0
  97. while 1:
  98. #print("-",[r,g,b],mode)
  99. for xx in range(d,0,-1):
  100. fi = int(xx*255/d)
  101. #print(xx,y)
  102. #print(fi,end=" ")
  103. color = '#%02x%02x%02x' % (int(255-r*fi),int(255-g*fi),int(255-b*fi))
  104. canvas.create_rectangle(x, y, x+20, y+20, fill=color)
  105. y+=22
  106. color = '#%02x%02x%02x' % (255,255,255)
  107. canvas.create_rectangle(x, y, x+20, y+20, fill=color)
  108. y+=22
  109. if grey <= 255:
  110. color = '#%02x%02x%02x' % (grey,grey,grey)
  111. canvas.create_rectangle(x, y, x+20, y+20, fill=color)
  112. grey +=255//25
  113. #print()
  114. if count == 1 and mode == 3:
  115. #print("-------")
  116. break
  117. y=2
  118. x+=22
  119. if r >= 1 and g >= 1 and b <= 0:
  120. mode = 1
  121. elif r <= 0 and g >= 1 and b <= 0:
  122. mode = 2
  123. elif r <= 0 and g >= 1 and b >= 1:
  124. mode = 3
  125. elif r <= 0 and g <= 0 and b >= 1:
  126. mode = 4
  127. elif r >= 1 and g <= 0 and b >= 1:
  128. mode = 5
  129. elif r >= 1 and g <= 0 and b <= 0:
  130. mode = 6
  131. count +=1
  132. s = 0.25 # 1/d #0.25
  133. if mode == 1:
  134. r -= s#0.25
  135. if mode == 2:
  136. b += s#0.25
  137. if mode == 3:
  138. g -= s#0.25
  139. if mode == 4:
  140. r += s#0.25
  141. if mode == 5:
  142. b -= s#0.25
  143. if mode == 6:
  144. g += s#0.25
  145. if r > 1:
  146. r=1
  147. if g > 1:
  148. g=1
  149. if b > 1:
  150. b=1
  151. if r < 0:
  152. r=0
  153. if g < 0:
  154. g=0
  155. if b < 0:
  156. b=0
  157. #print(dir(_b))
  158. #input()
  159. #b.configure(width = 10, activebackground = "#33B5E5", relief = FLAT)
  160. #b = canvas.create_window(10, 10, anchor="nw", window=f)
  161. #self.b.pack(fill=tk.Y, side=tk.TOP)
  162. #self.elem.append(self.b)
  163. if __name__ == "__main__":
  164. xframe = tk.Tk()
  165. xframe.geometry("1600x600")
  166. r()
  167. colorpicker(xframe)
  168. xframe.mainloop()