mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 23:21:29 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			161 lines
		
	
	
	
		
			6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			161 lines
		
	
	
	
		
			6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
"""TypeinViewer class.
 | 
						||
 | 
						||
The TypeinViewer is what you see at the lower right of the main Pynche
 | 
						||
widget.  It contains three text entry fields, one each for red, green, blue.
 | 
						||
Input into these windows is highly constrained; it only allows you to enter
 | 
						||
values that are legal for a color axis.  This usually means 0-255 for decimal
 | 
						||
input and 0x0 - 0xff for hex input.
 | 
						||
 | 
						||
You can toggle whether you want to view and input the values in either decimal
 | 
						||
or hex by clicking on Hexadecimal.  By clicking on Update while typing, the
 | 
						||
color selection will be made on every change to the text field.  Otherwise,
 | 
						||
you must hit Return or Tab to select the color.
 | 
						||
"""
 | 
						||
 | 
						||
from tkinter import *
 | 
						||
 | 
						||
 | 
						||
 | 
						||
class TypeinViewer:
 | 
						||
    def __init__(self, switchboard, master=None):
 | 
						||
        # non-gui ivars
 | 
						||
        self.__sb = switchboard
 | 
						||
        optiondb = switchboard.optiondb()
 | 
						||
        self.__hexp = BooleanVar()
 | 
						||
        self.__hexp.set(optiondb.get('HEXTYPE', 0))
 | 
						||
        self.__uwtyping = BooleanVar()
 | 
						||
        self.__uwtyping.set(optiondb.get('UPWHILETYPE', 0))
 | 
						||
        # create the gui
 | 
						||
        self.__frame = Frame(master, relief=RAISED, borderwidth=1)
 | 
						||
        self.__frame.grid(row=3, column=1, sticky='NSEW')
 | 
						||
        # Red
 | 
						||
        self.__xl = Label(self.__frame, text='Red:')
 | 
						||
        self.__xl.grid(row=0, column=0, sticky=E)
 | 
						||
        subframe = Frame(self.__frame)
 | 
						||
        subframe.grid(row=0, column=1)
 | 
						||
        self.__xox = Label(subframe, text='0x')
 | 
						||
        self.__xox.grid(row=0, column=0, sticky=E)
 | 
						||
        self.__xox['font'] = 'courier'
 | 
						||
        self.__x = Entry(subframe, width=3)
 | 
						||
        self.__x.grid(row=0, column=1)
 | 
						||
        self.__x.bindtags(self.__x.bindtags() + ('Normalize', 'Update'))
 | 
						||
        self.__x.bind_class('Normalize', '<Key>', self.__normalize)
 | 
						||
        self.__x.bind_class('Update'   , '<Key>', self.__maybeupdate)
 | 
						||
        # Green
 | 
						||
        self.__yl = Label(self.__frame, text='Green:')
 | 
						||
        self.__yl.grid(row=1, column=0, sticky=E)
 | 
						||
        subframe = Frame(self.__frame)
 | 
						||
        subframe.grid(row=1, column=1)
 | 
						||
        self.__yox = Label(subframe, text='0x')
 | 
						||
        self.__yox.grid(row=0, column=0, sticky=E)
 | 
						||
        self.__yox['font'] = 'courier'
 | 
						||
        self.__y = Entry(subframe, width=3)
 | 
						||
        self.__y.grid(row=0, column=1)
 | 
						||
        self.__y.bindtags(self.__y.bindtags() + ('Normalize', 'Update'))
 | 
						||
        # Blue
 | 
						||
        self.__zl = Label(self.__frame, text='Blue:')
 | 
						||
        self.__zl.grid(row=2, column=0, sticky=E)
 | 
						||
        subframe = Frame(self.__frame)
 | 
						||
        subframe.grid(row=2, column=1)
 | 
						||
        self.__zox = Label(subframe, text='0x')
 | 
						||
        self.__zox.grid(row=0, column=0, sticky=E)
 | 
						||
        self.__zox['font'] = 'courier'
 | 
						||
        self.__z = Entry(subframe, width=3)
 | 
						||
        self.__z.grid(row=0, column=1)
 | 
						||
        self.__z.bindtags(self.__z.bindtags() + ('Normalize', 'Update'))
 | 
						||
        # Update while typing?
 | 
						||
        self.__uwt = Checkbutton(self.__frame,
 | 
						||
                                 text='Update while typing',
 | 
						||
                                 variable=self.__uwtyping)
 | 
						||
        self.__uwt.grid(row=3, column=0, columnspan=2, sticky=W)
 | 
						||
        # Hex/Dec
 | 
						||
        self.__hex = Checkbutton(self.__frame,
 | 
						||
                                 text='Hexadecimal',
 | 
						||
                                 variable=self.__hexp,
 | 
						||
                                 command=self.__togglehex)
 | 
						||
        self.__hex.grid(row=4, column=0, columnspan=2, sticky=W)
 | 
						||
 | 
						||
    def __togglehex(self, event=None):
 | 
						||
        red, green, blue = self.__sb.current_rgb()
 | 
						||
        if self.__hexp.get():
 | 
						||
            label = '0x'
 | 
						||
        else:
 | 
						||
            label = '  '
 | 
						||
        self.__xox['text'] = label
 | 
						||
        self.__yox['text'] = label
 | 
						||
        self.__zox['text'] = label
 | 
						||
        self.update_yourself(red, green, blue)
 | 
						||
 | 
						||
    def __normalize(self, event=None):
 | 
						||
        ew = event.widget
 | 
						||
        contents = ew.get()
 | 
						||
        icursor = ew.index(INSERT)
 | 
						||
        if contents and contents[0] in 'xX' and self.__hexp.get():
 | 
						||
            contents = '0' + contents
 | 
						||
        # Figure out the contents in the current base.
 | 
						||
        try:
 | 
						||
            if self.__hexp.get():
 | 
						||
                v = int(contents, 16)
 | 
						||
            else:
 | 
						||
                v = int(contents)
 | 
						||
        except ValueError:
 | 
						||
            v = None
 | 
						||
        # If value is not legal, or empty, delete the last character inserted
 | 
						||
        # and ring the bell.  Don't ring the bell if the field is empty (it'll
 | 
						||
        # just equal zero.
 | 
						||
        if v is None:
 | 
						||
            pass
 | 
						||
        elif v < 0 or v > 255:
 | 
						||
            i = ew.index(INSERT)
 | 
						||
            if event.char:
 | 
						||
                contents = contents[:i-1] + contents[i:]
 | 
						||
                icursor -= 1
 | 
						||
            ew.bell()
 | 
						||
        elif self.__hexp.get():
 | 
						||
            contents = hex(v)[2:]
 | 
						||
        else:
 | 
						||
            contents = int(v)
 | 
						||
        ew.delete(0, END)
 | 
						||
        ew.insert(0, contents)
 | 
						||
        ew.icursor(icursor)
 | 
						||
 | 
						||
    def __maybeupdate(self, event=None):
 | 
						||
        if self.__uwtyping.get() or event.keysym in ('Return', 'Tab'):
 | 
						||
            self.__update(event)
 | 
						||
 | 
						||
    def __update(self, event=None):
 | 
						||
        redstr = self.__x.get() or '0'
 | 
						||
        greenstr = self.__y.get() or '0'
 | 
						||
        bluestr = self.__z.get() or '0'
 | 
						||
        if self.__hexp.get():
 | 
						||
            base = 16
 | 
						||
        else:
 | 
						||
            base = 10
 | 
						||
        red, green, blue = [int(x, base) for x in (redstr, greenstr, bluestr)]
 | 
						||
        self.__sb.update_views(red, green, blue)
 | 
						||
 | 
						||
    def update_yourself(self, red, green, blue):
 | 
						||
        if self.__hexp.get():
 | 
						||
            sred, sgreen, sblue = [hex(x)[2:] for x in (red, green, blue)]
 | 
						||
        else:
 | 
						||
            sred, sgreen, sblue = red, green, blue
 | 
						||
        x, y, z = self.__x, self.__y, self.__z
 | 
						||
        xicursor = x.index(INSERT)
 | 
						||
        yicursor = y.index(INSERT)
 | 
						||
        zicursor = z.index(INSERT)
 | 
						||
        x.delete(0, END)
 | 
						||
        y.delete(0, END)
 | 
						||
        z.delete(0, END)
 | 
						||
        x.insert(0, sred)
 | 
						||
        y.insert(0, sgreen)
 | 
						||
        z.insert(0, sblue)
 | 
						||
        x.icursor(xicursor)
 | 
						||
        y.icursor(yicursor)
 | 
						||
        z.icursor(zicursor)
 | 
						||
 | 
						||
    def hexp_var(self):
 | 
						||
        return self.__hexp
 | 
						||
 | 
						||
    def save_options(self, optiondb):
 | 
						||
        optiondb['HEXTYPE'] = self.__hexp.get()
 | 
						||
        optiondb['UPWHILETYPE'] = self.__uwtyping.get()
 |