"""DetailsViewer class.This class implements a pure input window which allows you to meticulouslyedit the current color. You have both mouse control of the color (via thebuttons along the bottom row), and there are keyboard bindings for each of theincrement/decrement buttons.The top three check buttons allow you to specify which of the three colorvariations are tied together when incrementing and decrementing. Red, green,and blue are self evident. By tying together red and green, you can modifythe yellow level of the color. By tying together red and blue, you can modifythe magenta level of the color. By tying together green and blue, you canmodify the cyan level, and by tying all three together, you can modify thegrey level.The behavior at the boundaries (0 and 255) are defined by the `At boundary'option menu:StopWhen the increment or decrement would send any of the tied variationsout of bounds, the entire delta is discarded.Wrap AroundWhen the increment or decrement would send any of the tied variationsout of bounds, the out of bounds variation is wrapped around to theother side. Thus if red were at 238 and 25 were added to it, redwould have the value 7.Preserve DistanceWhen the increment or decrement would send any of the tied variationsout of bounds, all tied variations are wrapped as one, so as topreserve the distance between them. Thus if green and blue were tied,and green was at 238 while blue was at 223, and an increment of 25were applied, green would be at 15 and blue would be at 0.SquashWhen the increment or decrement would send any of the tied variationsout of bounds, the out of bounds variation is set to the ceiling of255 or floor of 0, as appropriate. In this way, all tied variationsare squashed to one edge or the other.The following key bindings can be used as accelerators. Note that Pynche canfall behind if you hold the key down as a key repeat:Left arrow == -1Right arrow == +1Control + Left == -10Control + Right == 10Shift + Left == -25Shift + Right == +25"""from tkinter import *STOP = 'Stop'WRAP = 'Wrap Around'RATIO = 'Preserve Distance'GRAV = 'Squash'ADDTOVIEW = 'Details Window...'class DetailsViewer:def __init__(self, switchboard, master=None):self.__sb = switchboardoptiondb = switchboard.optiondb()self.__red, self.__green, self.__blue = switchboard.current_rgb()# GUIroot = self.__root = Toplevel(master, class_='Pynche')root.protocol('WM_DELETE_WINDOW', self.withdraw)root.title('Pynche Details Window')root.iconname('Pynche Details Window')root.bind('<Alt-q>', self.__quit)root.bind('<Alt-Q>', self.__quit)root.bind('<Alt-w>', self.withdraw)root.bind('<Alt-W>', self.withdraw)# acceleratorsroot.bind('<KeyPress-Left>', self.__minus1)root.bind('<KeyPress-Right>', self.__plus1)root.bind('<Control-KeyPress-Left>', self.__minus10)root.bind('<Control-KeyPress-Right>', self.__plus10)root.bind('<Shift-KeyPress-Left>', self.__minus25)root.bind('<Shift-KeyPress-Right>', self.__plus25)## color tiesframe = self.__frame = Frame(root)frame.pack(expand=YES, fill=X)self.__l1 = Label(frame, text='Move Sliders:')self.__l1.grid(row=1, column=0, sticky=E)self.__rvar = IntVar()self.__rvar.set(optiondb.get('RSLIDER', 4))self.__radio1 = Checkbutton(frame, text='Red',variable=self.__rvar,command=self.__effect,onvalue=4, offvalue=0)self.__radio1.grid(row=1, column=1, sticky=W)self.__gvar = IntVar()self.__gvar.set(optiondb.get('GSLIDER', 2))self.__radio2 = Checkbutton(frame, text='Green',variable=self.__gvar,command=self.__effect,onvalue=2, offvalue=0)self.__radio2.grid(row=2, column=1, sticky=W)self.__bvar = IntVar()self.__bvar.set(optiondb.get('BSLIDER', 1))self.__radio3 = Checkbutton(frame, text='Blue',variable=self.__bvar,command=self.__effect,onvalue=1, offvalue=0)self.__radio3.grid(row=3, column=1, sticky=W)self.__l2 = Label(frame)self.__l2.grid(row=4, column=1, sticky=W)self.__effect()## Boundary behaviorself.__l3 = Label(frame, text='At boundary:')self.__l3.grid(row=5, column=0, sticky=E)self.__boundvar = StringVar()self.__boundvar.set(optiondb.get('ATBOUND', STOP))self.__omenu = OptionMenu(frame, self.__boundvar,STOP, WRAP, RATIO, GRAV)self.__omenu.grid(row=5, column=1, sticky=W)self.__omenu.configure(width=17)## Buttonsframe = self.__btnframe = Frame(frame)frame.grid(row=0, column=0, columnspan=2, sticky='EW')self.__down25 = Button(frame, text='-25',command=self.__minus25)self.__down10 = Button(frame, text='-10',command=self.__minus10)self.__down1 = Button(frame, text='-1',command=self.__minus1)self.__up1 = Button(frame, text='+1',command=self.__plus1)self.__up10 = Button(frame, text='+10',command=self.__plus10)self.__up25 = Button(frame, text='+25',command=self.__plus25)self.__down25.pack(expand=YES, fill=X, side=LEFT)self.__down10.pack(expand=YES, fill=X, side=LEFT)self.__down1.pack(expand=YES, fill=X, side=LEFT)self.__up1.pack(expand=YES, fill=X, side=LEFT)self.__up10.pack(expand=YES, fill=X, side=LEFT)self.__up25.pack(expand=YES, fill=X, side=LEFT)def __effect(self, event=None):tie = self.__rvar.get() + self.__gvar.get() + self.__bvar.get()if tie in (0, 1, 2, 4):text = ''else:text = '(= %s Level)' % {3: 'Cyan',5: 'Magenta',6: 'Yellow',7: 'Grey'}[tie]self.__l2.configure(text=text)def __quit(self, event=None):self.__root.quit()def withdraw(self, event=None):self.__root.withdraw()def deiconify(self, event=None):self.__root.deiconify()def __minus25(self, event=None):self.__delta(-25)def __minus10(self, event=None):self.__delta(-10)def __minus1(self, event=None):self.__delta(-1)def __plus1(self, event=None):self.__delta(1)def __plus10(self, event=None):self.__delta(10)def __plus25(self, event=None):self.__delta(25)def __delta(self, delta):tie = []if self.__rvar.get():red = self.__red + deltatie.append(red)else:red = self.__redif self.__gvar.get():green = self.__green + deltatie.append(green)else:green = self.__greenif self.__bvar.get():blue = self.__blue + deltatie.append(blue)else:blue = self.__blue# now apply at boundary behavioratbound = self.__boundvar.get()if atbound == STOP:if red < 0 or green < 0 or blue < 0 or \red > 255 or green > 255 or blue > 255:# thenred, green, blue = self.__red, self.__green, self.__blueelif atbound == WRAP or (atbound == RATIO and len(tie) < 2):if red < 0:red += 256if green < 0:green += 256if blue < 0:blue += 256if red > 255:red -= 256if green > 255:green -= 256if blue > 255:blue -= 256elif atbound == RATIO:# for when 2 or 3 colors are tied togetherdir = 0for c in tie:if c < 0:dir = -1elif c > 255:dir = 1if dir == -1:delta = max(tie)if self.__rvar.get():red = red + 255 - deltaif self.__gvar.get():green = green + 255 - deltaif self.__bvar.get():blue = blue + 255 - deltaelif dir == 1:delta = min(tie)if self.__rvar.get():red = red - deltaif self.__gvar.get():green = green - deltaif self.__bvar.get():blue = blue - deltaelif atbound == GRAV:if red < 0:red = 0if green < 0:green = 0if blue < 0:blue = 0if red > 255:red = 255if green > 255:green = 255if blue > 255:blue = 255self.__sb.update_views(red, green, blue)self.__root.update_idletasks()def update_yourself(self, red, green, blue):self.__red = redself.__green = greenself.__blue = bluedef save_options(self, optiondb):optiondb['RSLIDER'] = self.__rvar.get()optiondb['GSLIDER'] = self.__gvar.get()optiondb['BSLIDER'] = self.__bvar.get()optiondb['ATBOUND'] = self.__boundvar.get()
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。