130 lines
2.8 KiB
Python
130 lines
2.8 KiB
Python
#! /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 = (128, 128, 128)
|
||
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()
|