1Pynche - The PYthonically Natural Color and Hue Editor
2
3Contact: Barry A. Warsaw
4Email:   bwarsaw@python.org
5Version: 1.3
6
7Introduction
8
9    Pynche is a color editor based largely on a similar program that I
10    originally wrote back in 1987 for the Sunview window system.  That
11    editor was called ICE, the Interactive Color Editor.  I'd always
12    wanted to port this program to X but didn't feel like hacking X
13    and C code to do it.  Fast forward many years, to where Python +
14    Tkinter provides such a nice programming environment, with enough
15    power, that I finally buckled down and re-implemented it.  I
16    changed the name because these days, too many other systems have
17    the acronym `ICE'.
18
19    Pynche should work with any variant of Python after 1.5.2
20    (e.g. 2.0.1 and 2.1.1), using Tk 8.0.x.  It's been tested on
21    Solaris 2.6, Windows NT 4, and various Linux distros.  You'll want
22    to be sure to have at least Tk 8.0.3 for Windows.  Also, Pynche is
23    very colormap intensive, so it doesn't work very well on 8-bit
24    graphics cards; 24bit+ graphics cards are so cheap these days,
25    I'll probably never "fix" that.
26
27    Pynche must find a text database of colors names in order to
28    provide `nearest' color matching.  Pynche is distributed with an
29    rgb.txt file from the X11R6.4 distribution for this reason, along
30    with other "Web related" database (see below).  You can use a
31    different file with the -d option.  The file xlicense.txt contains
32    the license only for rgb.txt and both files are in the X/
33    subdirectory.
34
35    Pynche is pronounced: Pin'-chee
36
37
38Running Standalone
39
40    On Unix, start it by running the `pynche' script.  On Windows, run
41    pynche.pyw to inhibit the console window.  When run from the
42    command line, the following options are recognized:
43
44    --database file
45    -d file
46        Alternate location of the color database file.  Without this
47        option, the first valid file found will be used (see below).
48
49    --initfile file
50    -i file
51        Alternate location of the persistent initialization file.  See
52        the section on Persistency below.
53
54    --ignore
55    -X
56        Ignore the persistent initialization file when starting up.
57        Pynche will still write the current option settings to the
58        persistent init file when it quits.
59
60    --help
61    -h
62        Print the help message.
63
64    initialcolor
65        a Tk color name or #rrggbb color spec to be used as the
66        initially selected color.  This overrides any color saved in
67        the persistent init file.  Since `#' needs to be escaped in
68        many shells, it is optional in the spec (e.g. #45dd1f is the
69        same as 45dd1f).
70
71
72Running as a Modal Dialog
73
74    Pynche can be run as a modal dialog, inside another application,
75    say as a general color chooser.  In fact, Grail 0.6 uses Pynche
76    and a future version of IDLE may as well.  Pynche supports the API
77    implemented by the Tkinter standard tkColorChooser module, with a
78    few changes as described below.  By importing pyColorChooser from
79    the Pynche package, you can run
80
81        pyColorChooser.askcolor()
82
83    which will popup Pynche as a modal dialog, and return the selected
84    color.
85
86    There are some UI differences when running as a modal
87    vs. standalone.  When running as a modal, there is no "Quit" menu
88    item under the "File" menu.  Instead there are "Okay" and "Cancel"
89    buttons.
90
91    When "Okay" is hit, askcolor() returns the tuple
92
93        ((r, g, b), "name")
94
95    where r, g, and b are red, green, and blue color values
96    respectively (in the range 0 to 255).  "name" will be a color name
97    from the color database if there is an exact match, otherwise it
98    will be an X11 color spec of the form "#rrggbb".  Note that this
99    is different than tkColorChooser, which doesn't know anything
100    about color names.
101
102    askcolor() supports the following optional keyword arguments:
103
104        color
105            the color to set as the initial selected color
106
107        master[*]
108            the master window to use as the parent of the modal
109            dialog.  Without this argument, pyColorChooser will create
110            its own Tkinter.Tk instance as the master.  This may not
111            be what you want.
112
113        databasefile
114            similar to the --database option, the value must be a
115            file name
116
117        initfile[*]
118            similar to the --initfile option, the value must be a
119            file name
120
121        ignore[*]
122            similar to the --ignore flag, the value is a boolean
123
124        wantspec
125            When this is true, the "name" field in the return tuple
126            will always be a color spec of the form "#rrggbb".  It
127            will not return a color name even if there is a match;
128            this is so pyColorChooser can exactly match the API of
129            tkColorChooser.
130
131        [*] these arguments must be specified the first time
132        askcolor() is used and cannot be changed on subsequent calls.
133
134
135The Colorstrip Window
136
137    The top part of the main Pynche window contains the "variation
138    strips".  Each strip contains a number of "color chips".  The
139    strips always indicate the currently selected color by a highlight
140    rectangle around the selected color chip, with an arrow pointing
141    to the chip.  Each arrow has an associated number giving you the
142    color value along the variation's axis.  Each variation strip
143    shows you the colors that are reachable from the selected color by
144    varying just one axis of the color solid.
145
146    For example, when the selected color is (in Red/Green/Blue
147    notation) 127/127/127, the Red Variations strip shows you every
148    color in the range 0/127/127 to 255/127/127.  Similarly for the
149    green and blue axes.  You can select any color by clicking on its
150    chip.  This will update the highlight rectangle and the arrow, as
151    well as other displays in Pynche.
152
153    Click on "Update while dragging" if you want Pynche to update the
154    selected color while you drag along any variation strip (this will
155    be a bit slower).  Click on "Hexadecimal" to display the arrow
156    numbers in hex.
157
158    There are also two shortcut buttons in this window, which
159    auto-select Black (0/0/0) and White (255/255/255).
160
161
162The Proof Window
163
164    In the lower left corner of the main window you see two larger
165    color chips.  The Selected chip shows you a larger version of the
166    color selected in the variation strips, along with its X11 color
167    specification.  The Nearest chip shows you the closest color in
168    the X11 database to the selected color, giving its X11 color
169    specification, and below that, its X11 color name.  When the
170    Selected chip color exactly matches the Nearest chip color, you
171    will see the color name appear below the color specification for
172    the Selected chip.
173
174    Clicking on the Nearest color chip selects that color.  Color
175    distance is calculated in the 3D space of the RGB color solid and
176    if more than one color name is the same distance from the selected
177    color, the first one found will be chosen.
178
179    Note that there may be more than one X11 color name for the same
180    RGB value.  In that case, the first one found in the text database
181    is designated the "primary" name, and this is shown under the
182    Nearest chip.  The other names are "aliases" and they are visible
183    in the Color List Window (see below).
184
185    Both the color specifications and color names are selectable for
186    copying and pasting into another window.
187
188
189The Type-in Window
190
191    At the lower right of the main window are three entry fields.
192    Here you can type numeric values for any of the three color axes.
193    Legal values are between 0 and 255, and these fields do not allow
194    you to enter illegal values.  You must hit Enter or Tab to select
195    the new color.
196
197    Click on "Update while typing" if you want Pynche to select the
198    color on every keystroke (well, every one that produces a legal
199    value!)  Click on "Hexadecimal" to display and enter color values
200    in hex.
201
202
203Other Views
204
205    There are three secondary windows which are not displayed by
206    default.  You can bring these up via the "View" menu on the main
207    Pynche window.
208
209
210The Text Window
211
212    The "Text Window" allows you to see what effects various colors
213    have on the standard Tk text widget elements.  In the upper part
214    of the window is a plain Tk text widget and here you can edit the
215    text, select a region of text, etc.  Below this is a button "Track
216    color changes".  When this is turned on, any colors selected in
217    the other windows will change the text widget element specified in
218    the radio buttons below.  When this is turned off, text widget
219    elements are not affected by color selection.
220
221    You can choose which element gets changed by color selection by
222    clicking on one of the radio buttons in the bottom part of this
223    window.  Text foreground and background affect the text in the
224    upper part of the window.  Selection foreground and background
225    affect the colors of the primary selection which is what you see
226    when you click the middle button (depending on window system) and
227    drag it through some text.
228
229    The Insertion is the insertion cursor in the text window, where
230    new text will be inserted as you type.  The insertion cursor only
231    has a background.
232
233
234The Color List Window
235
236    The "Color List" window shows every named color in the color name
237    database (this window may take a while to come up).  In the upper
238    part of the window you see a scrolling list of all the color names
239    in the database, in alphabetical order.  Click on any color to
240    select it.  In the bottom part of the window is displayed any
241    aliases for the selected color (those color names that have the
242    same RGB value, but were found later in the text database).  For
243    example, find the color "Black" and you'll see that its aliases
244    are "gray0" and "grey0".
245
246    If the color has no aliases you'll see "<no aliases>" here.  If you
247    just want to see if a color has an alias, and do not want to select a
248    color when you click on it, turn off "Update on Click".
249
250    Note that the color list is always updated when a color is selected
251    from the main window.  There's no way to turn this feature off.  If
252    the selected color has no matching color name you'll see
253    "<no matching color>" in the Aliases window.
254
255
256The Details Window
257
258    The "Details" window gives you more control over color selection
259    than just clicking on a color chip in the main window.  The row of
260    buttons along the top apply the specified increment and decrement
261    amounts to the selected color.  These delta amounts are applied to
262    the variation strips specified by the check boxes labeled "Move
263    Sliders".  Thus if just Red and Green are selected, hitting -10
264    will subtract 10 from the color value along the red and green
265    variation only.  Note the message under the checkboxes; this
266    indicates the primary color level being changed when more than one
267    slider is tied together.  For example, if Red and Green are
268    selected, you will be changing the Yellow level of the selected
269    color.
270
271    The "At Boundary" behavior determines what happens when any color
272    variation hits either the lower or upper boundaries (0 or 255) as
273    a result of clicking on the top row buttons:
274
275    Stop
276        When the increment or decrement would send any of the tied
277        variations out of bounds, the entire delta is discarded.
278
279    Wrap Around
280        When the increment or decrement would send any of the tied
281        variations out of bounds, the out of bounds value is wrapped
282        around to the other side.  Thus if red were at 238 and +25
283        were clicked, red would have the value 7.
284
285    Preserve Distance
286        When the increment or decrement would send any of the tied
287        variations out of bounds, all tied variations are wrapped as
288        one, so as to preserve the distance between them.  Thus if
289        green and blue were tied, and green was at 238 while blue was
290        at 223, and +25 were clicked, green would be at 15 and blue
291        would be at 0.
292
293    Squash
294        When the increment or decrement would send any of the tied
295        variations out of bounds, the out of bounds variation is set
296        to the ceiling of 255 or floor of 0, as appropriate.  In this
297        way, all tied variations are squashed to one edge or the
298        other.
299
300    The top row buttons have the following keyboard accelerators:
301
302    -25 == Shift Left Arrow
303    -10 == Control Left Arrow
304     -1 == Left Arrow
305     +1 == Right Arrow
306    +10 == Control Right Arrow
307    +25 == Shift Right Arrow
308
309
310Keyboard Accelerators
311
312    Alt-w in any secondary window dismisses the window.  In the main
313    window it exits Pynche (except when running as a modal).
314
315    Alt-q in any window exits Pynche (except when running as a modal).
316
317
318Persistency
319
320    Pynche remembers various settings of options and colors between
321    invocations, storing these values in a `persistent initialization
322    file'.  The actual location of this file is specified by the
323    --initfile option (see above), and defaults to ~/.pynche.
324
325    When Pynche exits, it saves these values in the init file, and
326    re-reads them when it starts up.  There is no locking on this
327    file, so if you run multiple instances of Pynche at a time, you
328    may clobber the init file.
329
330    The actual options stored include
331
332    - the currently selected color
333
334    - all settings of checkbox and radio button options in all windows
335
336    - the contents of the text window, the current text selection and
337      insertion point, and all current text widget element color
338      settings.
339
340    - the name of the color database file (but not its contents)
341
342    You can inhibit Pynche from reading the init file by supplying the
343    --ignore option on the command line.  However, you cannot suppress
344    the storing of the settings in the init file on Pynche exit.  If
345    you really want to do this, use /dev/null as the init file, using
346    --initfile.
347
348
349Color Name Database Files
350
351    Pynche uses a color name database file to calculate the nearest
352    color to the selected color, and to display in the Color List
353    view.  Several files are distributed with Pynche, described
354    below.  By default, the X11 color name database file is selected.
355    Other files:
356
357    html40colors.txt -- the HTML 4.0 guaranteed color names
358
359    websafe.txt -- the 216 "Web-safe" colors that Netscape and MSIE
360    guarantee will not be dithered.  These are specified in #rrggbb
361    format for both values and names
362
363    webcolors.txt -- The 140 color names that Tim Peters and his
364    sister say NS and MSIE both understand (with some controversy over
365    AliceBlue).
366
367    namedcolors.txt -- an alternative set of Netscape colors.
368
369    You can switch between files by choosing "Load palette..." from
370    the "File" menu.  This brings up a standard Tk file dialog.
371    Choose the file you want and then click "Ok".  If Pynche
372    understands the format in this file, it will load the database and
373    update the appropriate windows.  If not, it will bring up an error
374    dialog.
375
376
377To Do
378
379    Here's a brief list of things I want to do (some mythical day):
380
381    - Better support for resizing the top level windows
382
383    - More output views, e.g. color solids
384
385    - Have the notion of a `last color selected'; this may require a
386      new output view
387
388    - Support setting the font in the text view
389
390    - Support distutils setup.py for installation
391
392    I'm open to suggestions!
393
394
395
396Local Variables:
397indent-tabs-mode: nil
398End:
399