| #! /usr/bin/env python |
| |
| """Pynche: The PYthon Natural Color and Hue Editor. |
| |
| Pynche is based largely on a similar color editor I wrote years ago for the |
| Sunview window system. That editor was called ICE: the Interactive Color |
| Editor. I'd always wanted to port the editor to X but didn't feel like |
| hacking X and C code to do it. Fast forward many years, to where Python + |
| Tkinter + Pmw provides such a nice programming environment, with enough |
| power, that I finally buckled down and implemented it. I changed the name |
| because these days, too many other systems have the acronym `ICE'. |
| |
| This program currently requires Python 1.5 with Tkinter. It also requires at |
| least Pmw 0.6.1. It has only been tested on Solaris 2.6. Feedback is greatly |
| appreciated. Send email to bwarsaw@python.org |
| |
| Usage: %(PROGRAM)s [-c color] [-h] |
| |
| Where: |
| --color color |
| -c color |
| initial color, as an X color name or #RRGGBB format |
| |
| --help |
| -h |
| print this message |
| |
| """ |
| |
| __version__ = '1.0' |
| |
| import sys |
| import getopt |
| import Pmw |
| import ColorDB |
| from Tkinter import * |
| from PyncheWidget import PyncheWidget |
| |
| |
| |
| PROGRAM = sys.argv[0] |
| |
| # Milliseconds between interrupt checks |
| KEEPALIVE_TIMER = 500 |
| |
| RGBCOLOR = 1 |
| HSICOLOR = 2 |
| NAMEDCOLOR = 3 |
| |
| # Default locations of rgb.txt or other textual color database |
| RGB_TXT = [ |
| # Solaris OpenWindows |
| '/usr/openwin/lib/rgb.txt', |
| # add more here |
| ] |
| |
| |
| |
| def usage(status, msg=''): |
| if msg: |
| print msg |
| print __doc__ % globals() |
| sys.exit(status) |
| |
| |
| |
| app = None |
| |
| def keepalive(): |
| # Exercise the Python interpreter regularly so keybard interrupts get |
| # through. |
| app.tk.createtimerhandler(KEEPALIVE_TIMER, keepalive) |
| |
| |
| def main(): |
| global app |
| |
| initialcolor = 'grey50' |
| try: |
| opts, args = getopt.getopt(sys.argv[1:], |
| 'hc:', |
| ['color=', 'help']) |
| except getopt.error, msg: |
| usage(1, msg) |
| |
| if args: |
| usage(1) |
| |
| for opt, arg in opts: |
| if opt in ('-h', '--help'): |
| usage(0) |
| elif opt in ('-c', '--color'): |
| initialcolor = arg |
| |
| # create the windows and go |
| for f in RGB_TXT: |
| try: |
| colordb = ColorDB.get_colordb(f) |
| break |
| except IOError: |
| pass |
| else: |
| raise IOError('No color database file found') |
| |
| app = Pmw.initialise(fontScheme='pmw1') |
| app.title('Pynche %s' % __version__) |
| app.tk.createtimerhandler(KEEPALIVE_TIMER, keepalive) |
| |
| # get triplet for initial color |
| try: |
| red, green, blue = colordb.find_byname(initialcolor) |
| except ColorDB.BadColor: |
| # must be a #rrggbb style color |
| try: |
| red, green, blue = ColorDB.rrggbb_to_triplet(initialcolor) |
| except ColorDB.BadColor: |
| usage(1, 'Bad initial color: %s' % initialcolor) |
| |
| p = PyncheWidget(colordb, app, color=(red, green, blue)) |
| try: |
| keepalive() |
| app.mainloop() |
| except KeyboardInterrupt: |
| pass |
| |
| |
| |
| if __name__ == '__main__': |
| main() |