summaryrefslogtreecommitdiffstats
path: root/Tools/pynche/ChipViewer.py
diff options
context:
space:
mode:
authorBarry Warsaw <barry@python.org>1998-09-29 15:44:20 (GMT)
committerBarry Warsaw <barry@python.org>1998-09-29 15:44:20 (GMT)
commitdc492e6738a97d3ff55fb98295660e0edf8a51fa (patch)
treea2ac536724898262b26ba656d7547eed9a3fc08a /Tools/pynche/ChipViewer.py
parent63c9e9851ef229c641f24baea232ed8cffeaeb99 (diff)
downloadcpython-dc492e6738a97d3ff55fb98295660e0edf8a51fa.zip
cpython-dc492e6738a97d3ff55fb98295660e0edf8a51fa.tar.gz
cpython-dc492e6738a97d3ff55fb98295660e0edf8a51fa.tar.bz2
Un PMW-ified
Diffstat (limited to 'Tools/pynche/ChipViewer.py')
-rw-r--r--Tools/pynche/ChipViewer.py155
1 files changed, 84 insertions, 71 deletions
diff --git a/Tools/pynche/ChipViewer.py b/Tools/pynche/ChipViewer.py
index a2a9034..b4dfa85 100644
--- a/Tools/pynche/ChipViewer.py
+++ b/Tools/pynche/ChipViewer.py
@@ -1,79 +1,92 @@
-"""Color chip megawidget.
-This widget is used for displaying a color. It consists of three components:
-
- label -- a Tkinter.Label, this is the chip's label which is displayed
- about the color chip
- chip -- A Tkinter.Frame, the frame displaying the color
- name -- a Tkinter.Label, the name of the color
-
-In addition, the megawidget understands the following options:
-
- color -- the color displayed in the chip and name widgets
-
-When run as a script, this program displays a sample chip.
-"""
-
-
+from types import StringType
from Tkinter import *
-import Pmw
+import ColorDB
-class ChipWidget(Pmw.MegaWidget):
+
+class ChipWidget:
_WIDTH = 150
_HEIGHT = 80
- def __init__(self, parent=None, **kw):
- options = (('chip_borderwidth', 2, None),
- ('chip_width', self._WIDTH, None),
- ('chip_height', self._HEIGHT, None),
- ('label_text', 'Color', None),
- ('color', 'blue', self.__set_color),
- )
- self.defineoptions(kw, options)
-
- # initialize base class -- after defining options
- Pmw.MegaWidget.__init__(self, parent)
- interiorarg = (self.interior(),)
-
- # create the label
- self.__label = self.createcomponent(
- # component name, aliases, group
- 'label', (), None,
- # widget class, widget args
- Label, interiorarg)
- self.__label.grid(row=0, column=0)
-
- # create the color chip
- self.__chip = self.createcomponent(
- 'chip', (), None,
- Frame, interiorarg,
- relief=RAISED, borderwidth=2)
- self.__chip.grid(row=1, column=0)
-
- # create the color name
- self.__name = self.createcomponent(
- 'name', (), None,
- Label, interiorarg,)
- self.__name.grid(row=2, column=0)
-
- # Check keywords and initialize options
- self.initialiseoptions(ChipWidget)
-
- # called whenever `color' option is set
- def __set_color(self):
- color = self['color']
- self.__chip['background'] = color
- self.__name['text'] = color
+ def __init__(self,
+ parent = None,
+ width = _WIDTH,
+ height = _HEIGHT,
+ text = 'Color',
+ initialcolor = 'blue',
+ presscmd = None,
+ releasecmd = None):
+ # create the text label
+ self.__label = Label(parent, text=text)
+ self.__label.grid(row=0, column=0)
+ # create the color chip, implemented as a frame
+ self.__chip = Frame(parent, relief=RAISED, borderwidth=2,
+ width=width,
+ height=height,
+ background=initialcolor)
+ self.__chip.grid(row=1, column=0)
+ # create the color name, ctor argument must be a string
+ self.__name = Label(parent, text=initialcolor)
+ self.__name.grid(row=2, column=0)
+ #
+ # set bindings
+ if presscmd:
+ self.__chip.bind('<ButtonPress-1>', presscmd)
+ if releasecmd:
+ self.__chip.bind('<ButtonRelease-1>', releasecmd)
+
+ def set_color(self, color):
+ self.__chip.config(background=color)
+ self.__name.config(text=color)
+
+ def get_color(self):
+ return self.__chip['background']
+
+ def press(self):
+ self.__chip.configure(relief=SUNKEN)
+
+ def release(self):
+ self.__chip.configure(relief=RAISED)
-if __name__ == '__main__':
- root = Pmw.initialise(fontScheme='pmw1')
- root.title('ChipWidget demonstration')
-
- exitbtn = Button(root, text='Exit', command=root.destroy)
- exitbtn.pack(side=BOTTOM)
- widget = ChipWidget(root, color='red',
- chip_width=200,
- label_text='Selected Color')
- widget.pack()
- root.mainloop()
+class ChipViewer:
+ def __init__(self, switchboard, parent=None):
+ self.__sb = switchboard
+ self.__frame = Frame(parent)
+ self.__frame.pack()
+ # create the chip that will display the currently selected color
+ # exactly
+ self.__sframe = Frame(self.__frame)
+ self.__sframe.grid(row=0, column=0)
+ self.__selected = ChipWidget(self.__sframe, text='Selected')
+ # create the chip that will display the nearest real X11 color
+ # database color name
+ self.__nframe = Frame(self.__frame)
+ self.__nframe.grid(row=0, column=1)
+ self.__nearest = ChipWidget(self.__nframe, text='Nearest',
+ presscmd = self.__buttonpress,
+ releasecmd = self.__buttonrelease)
+
+ def update_yourself(self, red, green, blue):
+ # TBD: should exactname default to X11 color name if their is an exact
+ # match for the rgb triplet? Part of me says it's nice to see both
+ # names for the color, the other part says that it's better to
+ # feedback the exact match.
+ rgbtuple = (red, green, blue)
+ try:
+ allcolors = self.__sb.colordb().find_byrgb(rgbtuple)
+ exactname = allcolors[0]
+ except ColorDB.BadColor:
+ exactname = ColorDB.triplet_to_rrggbb(rgbtuple)
+ nearest = self.__sb.colordb().nearest(red, green, blue)
+ self.__selected.set_color(exactname)
+ self.__nearest.set_color(nearest)
+
+ def __buttonpress(self, event=None):
+ self.__nearest.press()
+
+ def __buttonrelease(self, event=None):
+ self.__nearest.release()
+ colorname = self.__nearest.get_color()
+ red, green, blue = self.__sb.colordb().find_byname(colorname)
+ self.__sb.update_views(red, green, blue)