Scales, Frame, Label
Color Creator is not just a demo but a practical tool for matching a color on a computer screen pretty much spot on – at least as close as a users eye and hand can get. It is less complicated than it looks at first, just using a frame, some scales and a label. You do have to contend with some of the values being hexadecimal.
# Color Creator # (c) 2018 John A. Oakey # Permission is given to use for any non-commercial purpose from tkinter import * root = Tk() # create a control value to hold composite color code compcode = StringVar() compcode.set("#000000") mixcolor=StringVar() mixcolor.set("#000000") # will need this when we go to color our frame redval=IntVar(0) blueval=IntVar(0) greenval=IntVar(0) # The general idea here is pretty simple, set up three scales - one each for red, # blue, and green that a user can adjust with a scale and then use a lable to # show the color that the combination of values with yeild. # take a truncated value gathered by one of the color scale function and get the hex digits for its value def newval(scaleval): scalehex = str(hex(scaleval)[2:]) # if len(scalehex) == 1: scalehex = "0" + scalehex return scalehex # construct a hexidecimal string that will work setting colors def fixmix(*args): mixcolor.set("#" + str(newval(redval.get())) + str(newval(greenval.get())) + str(newval(blueval.get()))) mixframe["bg"] = mixcolor.get() return() # the next three functions are identical except each does a different color # get red scale value, show value, update scale color, update mixed color code def redchg(self): redvaluelabel["text"] = str(redval.get()) scalehex = newval(redval.get()) tempcode = compcode.get() compcode.set("#" + scalehex + tempcode[3:7]) scalehex = "#" + scalehex + "0000" redscale["bg"] = scalehex fixmix() # get green scale value, show value, update scale color, update mixed color code def greenchg(self): greenvaluelabel["text"] = str(greenval.get()) scalehex = newval(greenval.get()) tempcode = compcode.get() compcode.set(tempcode[0:3] + scalehex + tempcode[5:8]) scalehex = "#00" + scalehex + "00" greenscale["bg"] = scalehex fixmix() # get blue scale value, show value, update scale color, update mixed color code def bluechg(self): bluevaluelabel["text"] = str(blueval.get()) scalehex = newval(blueval.get()) tempcode = compcode.get() compcode.set(tempcode[0:5] + scalehex) scalehex = "#0000" + scalehex bluescale["bg"] = scalehex fixmix() # create toplevel frame to work in bigframe = Frame(root, padx=20, pady=20) bigframe.grid() # row 0 col 0 create app label applabel = Label(bigframe, text="Composite Color Scale Designer", font=("Arial", 22), fg="blue") applabel.grid(column=0, row=0, columnspan=6, ipadx=3, ipady=3) # label for red slider redlabel = Label(bigframe, text="Red Scale", font=("Arial", 18)) redlabel.grid(column=0, row=2, columnspan=2, sticky=W) # red slider redscale = Scale(bigframe, from_=0, to=255, orient=HORIZONTAL, length=255, bg="#880000", command=redchg, digits=0, sliderlength=20, troughcolor="white", label="Red Select Scale", bd=8, relief="sunken", variable=redval) redscale.grid(column=0, row=3, ipady=10, ipadx=10, columnspan=5, sticky=W) # redvalue frame redvalueframe = LabelFrame(bigframe, height=15, width=30, text="red value", relief="raised", bd=10) redvalueframe.grid(column=4, row=3, columnspan=2, rowspan=2, ipady=10, ipadx=10, sticky=NE) # red value label to go in redvalueframe redvaluelabel = Label(redvalueframe, text="000", font=("Arial", 20), justify="right") redvaluelabel.grid(ipadx=10) # label for green slider greenlabel = Label(bigframe, text="Green Scale", font=("Arial", 18)) greenlabel.grid(column=0, row=4, columnspan=2, sticky=W) # green slider greenscale = Scale(bigframe, from_=0, to=255, orient=HORIZONTAL, length=255, bg="#008800", command=greenchg, digits=0, sliderlength=20, troughcolor="white", label="Green Select Scale", bd=8, relief="sunken", variable=greenval) greenscale.grid(column=0, row=5, ipady=10, ipadx=10, columnspan=5, sticky=W) # green value frame greenvalueframe = LabelFrame(bigframe, height=15, width=30, text="green value", relief="raised", bd=10) greenvalueframe.grid(column=4, row=5, columnspan=2, rowspan=2, ipady=10, ipadx=10, sticky=NE) # green value label to go in greenvalueframe greenvaluelabel = Label(greenvalueframe, text="000", font=("Arial", 20), justify="right") greenvaluelabel.grid(ipadx=10) # label for blue slider bluelabel = Label(bigframe, text="Blue Scale", font=("Arial", 18)) bluelabel.grid(column=0, row=6, columnspan=2, sticky=W) # blue slider bluescale = Scale(bigframe, from_=0, to=255, orient=HORIZONTAL, length=255, bg="#000088", command=bluechg, digits=0, sliderlength=20, troughcolor="white", label="Blue Select Scale", bd=8, relief="sunken", variable=blueval) bluescale.grid(column=0, row=7, ipady=10, ipadx=10, columnspan=5, sticky=W) # blue value frame bluevalueframe = LabelFrame(bigframe, height=15, width=30, text="blue value", relief="raised", bd=10) bluevalueframe.grid(column=4, row=7, columnspan=2, rowspan=2, ipady=10, ipadx=10, sticky=NE) # blue value label to go in bluevalueframe bluevaluelabel = Label(bluevalueframe, text="000", font=("Arial", 20), justify="right") bluevaluelabel.grid(ipadx=10) # label for composit display complabel = Label(bigframe, text="Composite Color", font=("Arial", 18)) complabel.grid(column=0, row=10, columnspan=2, sticky=W) # frame for composite color display mixframe = Frame(bigframe, bg=mixcolor.get(), height=50, width=255, bd=8, relief="sunken") mixframe.grid(column=0, row=11, ipady=10, ipadx=10, stick=W) # frame to hold composite value compvalueframe = LabelFrame(bigframe, height=25, width=30, text="composite hex value", relief="raised", bd=10) compvalueframe.grid(column=4, row=11, columnspan=2, rowspan=2, ipady=10, ipadx=10) # composite value label to go in compvalueframe compvaluelabel = Label(compvalueframe, textvariable=compcode, font=("Arial", 18), justify="right") compvaluelabel.grid(ipadx=2, sticky=N) # footer label footlabel = Label(bigframe, text="(c) 2017 John A. Oakey: john@johnoakey.com") footlabel.grid(column=0, row=14, ipady=10, ipadx=10, columnspan=6) root.mainloop()