Many changes to support a second mode of operation. Pynche can now be
run either as a standalone application (by running pynche or
pynche.pyw), or as a modal dialog inside another application. This
can be done by importing pyColorChooser and running askcolor(). The
API for this is the same as the tkColorChooser.askcolor() API, namely:
When `Okay' is hit, askcolor() returns ((r, g, b), "name"). When
`Cancel' is hit, askcolor() returns (None, None).
Note the following differences:
1. pyColorChooser.askcolor() takes an optional keyword `master'
which if set tells Pynche to run as a modal dialog. `master'
is a Tkinter parent window. Without the `master' keyword
Pynche runs standalone.
2. in pyColorChooser.askcolor() will return a Tk/X11 color name as
"name" if there is an exact match, otherwise it will return a
color spec, e.g. "#rrggbb". tkColorChooser can't return a
color name.
There are also some UI differences when running standalone vs. modal.
When modal, there is no "File" menu, but instead there are "Okay" and
"Cancel" buttons.
The implementation of all this is a bit of a hack, but it seems to
work moderately well. I'm not guaranteeing the pyColorChooser.Chooser
class has the same semantics as the tkColorChooser.Chooser class.
1998-10-22 03:25:59 +00:00
|
|
|
|
"""Color chooser implementing (almost) the tkColorColor interface
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
import os
|
|
|
|
|
import Main
|
|
|
|
|
import ColorDB
|
|
|
|
|
|
|
|
|
|
class Chooser:
|
|
|
|
|
"""Ask for a color"""
|
|
|
|
|
def __init__(self,
|
|
|
|
|
master = None,
|
|
|
|
|
databasefile = None,
|
|
|
|
|
initfile = None,
|
1998-10-22 03:44:52 +00:00
|
|
|
|
ignore = None,
|
|
|
|
|
wantspec = None):
|
Many changes to support a second mode of operation. Pynche can now be
run either as a standalone application (by running pynche or
pynche.pyw), or as a modal dialog inside another application. This
can be done by importing pyColorChooser and running askcolor(). The
API for this is the same as the tkColorChooser.askcolor() API, namely:
When `Okay' is hit, askcolor() returns ((r, g, b), "name"). When
`Cancel' is hit, askcolor() returns (None, None).
Note the following differences:
1. pyColorChooser.askcolor() takes an optional keyword `master'
which if set tells Pynche to run as a modal dialog. `master'
is a Tkinter parent window. Without the `master' keyword
Pynche runs standalone.
2. in pyColorChooser.askcolor() will return a Tk/X11 color name as
"name" if there is an exact match, otherwise it will return a
color spec, e.g. "#rrggbb". tkColorChooser can't return a
color name.
There are also some UI differences when running standalone vs. modal.
When modal, there is no "File" menu, but instead there are "Okay" and
"Cancel" buttons.
The implementation of all this is a bit of a hack, but it seems to
work moderately well. I'm not guaranteeing the pyColorChooser.Chooser
class has the same semantics as the tkColorChooser.Chooser class.
1998-10-22 03:25:59 +00:00
|
|
|
|
self.__master = master
|
|
|
|
|
self.__databasefile = databasefile
|
|
|
|
|
self.__initfile = initfile or os.path.expanduser('~/.pynche')
|
|
|
|
|
self.__ignore = ignore
|
|
|
|
|
self.__pw = None
|
1998-10-22 03:44:52 +00:00
|
|
|
|
self.__wantspec = wantspec
|
Many changes to support a second mode of operation. Pynche can now be
run either as a standalone application (by running pynche or
pynche.pyw), or as a modal dialog inside another application. This
can be done by importing pyColorChooser and running askcolor(). The
API for this is the same as the tkColorChooser.askcolor() API, namely:
When `Okay' is hit, askcolor() returns ((r, g, b), "name"). When
`Cancel' is hit, askcolor() returns (None, None).
Note the following differences:
1. pyColorChooser.askcolor() takes an optional keyword `master'
which if set tells Pynche to run as a modal dialog. `master'
is a Tkinter parent window. Without the `master' keyword
Pynche runs standalone.
2. in pyColorChooser.askcolor() will return a Tk/X11 color name as
"name" if there is an exact match, otherwise it will return a
color spec, e.g. "#rrggbb". tkColorChooser can't return a
color name.
There are also some UI differences when running standalone vs. modal.
When modal, there is no "File" menu, but instead there are "Okay" and
"Cancel" buttons.
The implementation of all this is a bit of a hack, but it seems to
work moderately well. I'm not guaranteeing the pyColorChooser.Chooser
class has the same semantics as the tkColorChooser.Chooser class.
1998-10-22 03:25:59 +00:00
|
|
|
|
|
1999-04-27 18:56:35 +00:00
|
|
|
|
def show(self, color, options):
|
|
|
|
|
# scan for options that can override the ctor options
|
|
|
|
|
self.__wantspec = options.get('wantspec', self.__wantspec)
|
|
|
|
|
dbfile = options.get('databasefile', self.__databasefile)
|
|
|
|
|
# load the database file
|
|
|
|
|
colordb = None
|
|
|
|
|
if dbfile <> self.__databasefile:
|
|
|
|
|
colordb = ColorDB.get_colordb(dbfile)
|
1998-10-22 18:51:22 +00:00
|
|
|
|
if not self.__master:
|
|
|
|
|
from Tkinter import Tk
|
|
|
|
|
self.__master = Tk()
|
Many changes to support a second mode of operation. Pynche can now be
run either as a standalone application (by running pynche or
pynche.pyw), or as a modal dialog inside another application. This
can be done by importing pyColorChooser and running askcolor(). The
API for this is the same as the tkColorChooser.askcolor() API, namely:
When `Okay' is hit, askcolor() returns ((r, g, b), "name"). When
`Cancel' is hit, askcolor() returns (None, None).
Note the following differences:
1. pyColorChooser.askcolor() takes an optional keyword `master'
which if set tells Pynche to run as a modal dialog. `master'
is a Tkinter parent window. Without the `master' keyword
Pynche runs standalone.
2. in pyColorChooser.askcolor() will return a Tk/X11 color name as
"name" if there is an exact match, otherwise it will return a
color spec, e.g. "#rrggbb". tkColorChooser can't return a
color name.
There are also some UI differences when running standalone vs. modal.
When modal, there is no "File" menu, but instead there are "Okay" and
"Cancel" buttons.
The implementation of all this is a bit of a hack, but it seems to
work moderately well. I'm not guaranteeing the pyColorChooser.Chooser
class has the same semantics as the tkColorChooser.Chooser class.
1998-10-22 03:25:59 +00:00
|
|
|
|
if not self.__pw:
|
|
|
|
|
self.__pw, self.__sb = \
|
|
|
|
|
Main.build(master = self.__master,
|
|
|
|
|
initfile = self.__initfile,
|
|
|
|
|
ignore = self.__ignore)
|
1998-10-22 18:51:22 +00:00
|
|
|
|
else:
|
|
|
|
|
self.__pw.deiconify()
|
|
|
|
|
# convert color
|
1999-04-27 18:56:35 +00:00
|
|
|
|
if colordb:
|
|
|
|
|
self.__sb.set_colordb(colordb)
|
|
|
|
|
else:
|
|
|
|
|
colordb = self.__sb.colordb()
|
1998-10-22 18:51:22 +00:00
|
|
|
|
if color:
|
|
|
|
|
r, g, b = Main.initial_color(color, colordb)
|
|
|
|
|
self.__sb.update_views(r, g, b)
|
|
|
|
|
# reset the canceled flag and run it
|
|
|
|
|
self.__sb.canceled(0)
|
Many changes to support a second mode of operation. Pynche can now be
run either as a standalone application (by running pynche or
pynche.pyw), or as a modal dialog inside another application. This
can be done by importing pyColorChooser and running askcolor(). The
API for this is the same as the tkColorChooser.askcolor() API, namely:
When `Okay' is hit, askcolor() returns ((r, g, b), "name"). When
`Cancel' is hit, askcolor() returns (None, None).
Note the following differences:
1. pyColorChooser.askcolor() takes an optional keyword `master'
which if set tells Pynche to run as a modal dialog. `master'
is a Tkinter parent window. Without the `master' keyword
Pynche runs standalone.
2. in pyColorChooser.askcolor() will return a Tk/X11 color name as
"name" if there is an exact match, otherwise it will return a
color spec, e.g. "#rrggbb". tkColorChooser can't return a
color name.
There are also some UI differences when running standalone vs. modal.
When modal, there is no "File" menu, but instead there are "Okay" and
"Cancel" buttons.
The implementation of all this is a bit of a hack, but it seems to
work moderately well. I'm not guaranteeing the pyColorChooser.Chooser
class has the same semantics as the tkColorChooser.Chooser class.
1998-10-22 03:25:59 +00:00
|
|
|
|
Main.run(self.__pw, self.__sb)
|
|
|
|
|
rgbtuple = self.__sb.current_rgb()
|
|
|
|
|
self.__pw.withdraw()
|
|
|
|
|
# check to see if the cancel button was pushed
|
|
|
|
|
if self.__sb.canceled_p():
|
|
|
|
|
return None, None
|
|
|
|
|
# try to return the color name from the database if there is an exact
|
|
|
|
|
# match, otherwise use the "#rrggbb" spec. TBD: Forget about color
|
|
|
|
|
# aliases for now, maybe later we should return these too.
|
1998-10-22 03:44:52 +00:00
|
|
|
|
name = None
|
|
|
|
|
if not self.__wantspec:
|
|
|
|
|
try:
|
|
|
|
|
name = colordb.find_byrgb(rgbtuple)[0]
|
|
|
|
|
except ColorDB.BadColor:
|
|
|
|
|
pass
|
|
|
|
|
if name is None:
|
Many changes to support a second mode of operation. Pynche can now be
run either as a standalone application (by running pynche or
pynche.pyw), or as a modal dialog inside another application. This
can be done by importing pyColorChooser and running askcolor(). The
API for this is the same as the tkColorChooser.askcolor() API, namely:
When `Okay' is hit, askcolor() returns ((r, g, b), "name"). When
`Cancel' is hit, askcolor() returns (None, None).
Note the following differences:
1. pyColorChooser.askcolor() takes an optional keyword `master'
which if set tells Pynche to run as a modal dialog. `master'
is a Tkinter parent window. Without the `master' keyword
Pynche runs standalone.
2. in pyColorChooser.askcolor() will return a Tk/X11 color name as
"name" if there is an exact match, otherwise it will return a
color spec, e.g. "#rrggbb". tkColorChooser can't return a
color name.
There are also some UI differences when running standalone vs. modal.
When modal, there is no "File" menu, but instead there are "Okay" and
"Cancel" buttons.
The implementation of all this is a bit of a hack, but it seems to
work moderately well. I'm not guaranteeing the pyColorChooser.Chooser
class has the same semantics as the tkColorChooser.Chooser class.
1998-10-22 03:25:59 +00:00
|
|
|
|
name = ColorDB.triplet_to_rrggbb(rgbtuple)
|
|
|
|
|
return rgbtuple, name
|
|
|
|
|
|
1998-10-22 18:51:22 +00:00
|
|
|
|
def save(self):
|
|
|
|
|
if self.__sb:
|
|
|
|
|
self.__sb.save_views()
|
Many changes to support a second mode of operation. Pynche can now be
run either as a standalone application (by running pynche or
pynche.pyw), or as a modal dialog inside another application. This
can be done by importing pyColorChooser and running askcolor(). The
API for this is the same as the tkColorChooser.askcolor() API, namely:
When `Okay' is hit, askcolor() returns ((r, g, b), "name"). When
`Cancel' is hit, askcolor() returns (None, None).
Note the following differences:
1. pyColorChooser.askcolor() takes an optional keyword `master'
which if set tells Pynche to run as a modal dialog. `master'
is a Tkinter parent window. Without the `master' keyword
Pynche runs standalone.
2. in pyColorChooser.askcolor() will return a Tk/X11 color name as
"name" if there is an exact match, otherwise it will return a
color spec, e.g. "#rrggbb". tkColorChooser can't return a
color name.
There are also some UI differences when running standalone vs. modal.
When modal, there is no "File" menu, but instead there are "Okay" and
"Cancel" buttons.
The implementation of all this is a bit of a hack, but it seems to
work moderately well. I'm not guaranteeing the pyColorChooser.Chooser
class has the same semantics as the tkColorChooser.Chooser class.
1998-10-22 03:25:59 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# convenience stuff
|
1998-10-22 18:51:22 +00:00
|
|
|
|
_chooser = None
|
|
|
|
|
|
Many changes to support a second mode of operation. Pynche can now be
run either as a standalone application (by running pynche or
pynche.pyw), or as a modal dialog inside another application. This
can be done by importing pyColorChooser and running askcolor(). The
API for this is the same as the tkColorChooser.askcolor() API, namely:
When `Okay' is hit, askcolor() returns ((r, g, b), "name"). When
`Cancel' is hit, askcolor() returns (None, None).
Note the following differences:
1. pyColorChooser.askcolor() takes an optional keyword `master'
which if set tells Pynche to run as a modal dialog. `master'
is a Tkinter parent window. Without the `master' keyword
Pynche runs standalone.
2. in pyColorChooser.askcolor() will return a Tk/X11 color name as
"name" if there is an exact match, otherwise it will return a
color spec, e.g. "#rrggbb". tkColorChooser can't return a
color name.
There are also some UI differences when running standalone vs. modal.
When modal, there is no "File" menu, but instead there are "Okay" and
"Cancel" buttons.
The implementation of all this is a bit of a hack, but it seems to
work moderately well. I'm not guaranteeing the pyColorChooser.Chooser
class has the same semantics as the tkColorChooser.Chooser class.
1998-10-22 03:25:59 +00:00
|
|
|
|
def askcolor(color = None, **options):
|
|
|
|
|
"""Ask for a color"""
|
1998-10-22 18:51:22 +00:00
|
|
|
|
global _chooser
|
|
|
|
|
if not _chooser:
|
|
|
|
|
_chooser = apply(Chooser, (), options)
|
1999-04-27 18:56:35 +00:00
|
|
|
|
return _chooser.show(color, options)
|
Many changes to support a second mode of operation. Pynche can now be
run either as a standalone application (by running pynche or
pynche.pyw), or as a modal dialog inside another application. This
can be done by importing pyColorChooser and running askcolor(). The
API for this is the same as the tkColorChooser.askcolor() API, namely:
When `Okay' is hit, askcolor() returns ((r, g, b), "name"). When
`Cancel' is hit, askcolor() returns (None, None).
Note the following differences:
1. pyColorChooser.askcolor() takes an optional keyword `master'
which if set tells Pynche to run as a modal dialog. `master'
is a Tkinter parent window. Without the `master' keyword
Pynche runs standalone.
2. in pyColorChooser.askcolor() will return a Tk/X11 color name as
"name" if there is an exact match, otherwise it will return a
color spec, e.g. "#rrggbb". tkColorChooser can't return a
color name.
There are also some UI differences when running standalone vs. modal.
When modal, there is no "File" menu, but instead there are "Okay" and
"Cancel" buttons.
The implementation of all this is a bit of a hack, but it seems to
work moderately well. I'm not guaranteeing the pyColorChooser.Chooser
class has the same semantics as the tkColorChooser.Chooser class.
1998-10-22 03:25:59 +00:00
|
|
|
|
|
1998-10-22 18:51:22 +00:00
|
|
|
|
def save():
|
|
|
|
|
global _chooser
|
|
|
|
|
if _chooser:
|
|
|
|
|
_chooser.save()
|
Many changes to support a second mode of operation. Pynche can now be
run either as a standalone application (by running pynche or
pynche.pyw), or as a modal dialog inside another application. This
can be done by importing pyColorChooser and running askcolor(). The
API for this is the same as the tkColorChooser.askcolor() API, namely:
When `Okay' is hit, askcolor() returns ((r, g, b), "name"). When
`Cancel' is hit, askcolor() returns (None, None).
Note the following differences:
1. pyColorChooser.askcolor() takes an optional keyword `master'
which if set tells Pynche to run as a modal dialog. `master'
is a Tkinter parent window. Without the `master' keyword
Pynche runs standalone.
2. in pyColorChooser.askcolor() will return a Tk/X11 color name as
"name" if there is an exact match, otherwise it will return a
color spec, e.g. "#rrggbb". tkColorChooser can't return a
color name.
There are also some UI differences when running standalone vs. modal.
When modal, there is no "File" menu, but instead there are "Okay" and
"Cancel" buttons.
The implementation of all this is a bit of a hack, but it seems to
work moderately well. I'm not guaranteeing the pyColorChooser.Chooser
class has the same semantics as the tkColorChooser.Chooser class.
1998-10-22 03:25:59 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# test stuff
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
|
class Tester:
|
|
|
|
|
def __init__(self):
|
|
|
|
|
from Tkinter import *
|
|
|
|
|
self.__root = tk = Tk()
|
|
|
|
|
b = Button(tk, text='Choose Color...', command=self.__choose)
|
|
|
|
|
b.pack()
|
|
|
|
|
self.__l = Label(tk)
|
|
|
|
|
self.__l.pack()
|
|
|
|
|
q = Button(tk, text='Quit', command=self.__quit)
|
|
|
|
|
q.pack()
|
|
|
|
|
|
|
|
|
|
def __choose(self, event=None):
|
|
|
|
|
rgb, name = askcolor(master=self.__root)
|
|
|
|
|
if rgb is None:
|
|
|
|
|
text = 'You hit CANCEL!'
|
|
|
|
|
else:
|
|
|
|
|
r, g, b = rgb
|
|
|
|
|
text = 'You picked %s (%3d/%3d/%3d)' % (name, r, g, b)
|
|
|
|
|
self.__l.configure(text=text)
|
|
|
|
|
|
|
|
|
|
def __quit(self, event=None):
|
|
|
|
|
self.__root.quit()
|
|
|
|
|
|
|
|
|
|
def run(self):
|
|
|
|
|
self.__root.mainloop()
|
|
|
|
|
t = Tester()
|
|
|
|
|
t.run()
|
|
|
|
|
# simpler
|
|
|
|
|
## print 'color:', askcolor()
|
|
|
|
|
## print 'color:', askcolor()
|