Fix issue number in comment.
[python.git] / Tools / pynche / pyColorChooser.py
blob56f694062b92bbee990389e86f3dc689323c2206
1 """Color chooser implementing (almost) the tkColorColor interface
2 """
4 import os
5 import Main
6 import ColorDB
9 \f
10 class Chooser:
11 """Ask for a color"""
12 def __init__(self,
13 master = None,
14 databasefile = None,
15 initfile = None,
16 ignore = None,
17 wantspec = None):
18 self.__master = master
19 self.__databasefile = databasefile
20 self.__initfile = initfile or os.path.expanduser('~/.pynche')
21 self.__ignore = ignore
22 self.__pw = None
23 self.__wantspec = wantspec
25 def show(self, color, options):
26 # scan for options that can override the ctor options
27 self.__wantspec = options.get('wantspec', self.__wantspec)
28 dbfile = options.get('databasefile', self.__databasefile)
29 # load the database file
30 colordb = None
31 if dbfile <> self.__databasefile:
32 colordb = ColorDB.get_colordb(dbfile)
33 if not self.__master:
34 from Tkinter import Tk
35 self.__master = Tk()
36 if not self.__pw:
37 self.__pw, self.__sb = \
38 Main.build(master = self.__master,
39 initfile = self.__initfile,
40 ignore = self.__ignore)
41 else:
42 self.__pw.deiconify()
43 # convert color
44 if colordb:
45 self.__sb.set_colordb(colordb)
46 else:
47 colordb = self.__sb.colordb()
48 if color:
49 r, g, b = Main.initial_color(color, colordb)
50 self.__sb.update_views(r, g, b)
51 # reset the canceled flag and run it
52 self.__sb.canceled(0)
53 Main.run(self.__pw, self.__sb)
54 rgbtuple = self.__sb.current_rgb()
55 self.__pw.withdraw()
56 # check to see if the cancel button was pushed
57 if self.__sb.canceled_p():
58 return None, None
59 # Try to return the color name from the database if there is an exact
60 # match, otherwise use the "#rrggbb" spec. BAW: Forget about color
61 # aliases for now, maybe later we should return these too.
62 name = None
63 if not self.__wantspec:
64 try:
65 name = colordb.find_byrgb(rgbtuple)[0]
66 except ColorDB.BadColor:
67 pass
68 if name is None:
69 name = ColorDB.triplet_to_rrggbb(rgbtuple)
70 return rgbtuple, name
72 def save(self):
73 if self.__sb:
74 self.__sb.save_views()
77 # convenience stuff
78 _chooser = None
80 def askcolor(color = None, **options):
81 """Ask for a color"""
82 global _chooser
83 if not _chooser:
84 _chooser = apply(Chooser, (), options)
85 return _chooser.show(color, options)
87 def save():
88 global _chooser
89 if _chooser:
90 _chooser.save()
93 # test stuff
94 if __name__ == '__main__':
95 from Tkinter import *
97 class Tester:
98 def __init__(self):
99 self.__root = tk = Tk()
100 b = Button(tk, text='Choose Color...', command=self.__choose)
101 b.pack()
102 self.__l = Label(tk)
103 self.__l.pack()
104 q = Button(tk, text='Quit', command=self.__quit)
105 q.pack()
107 def __choose(self, event=None):
108 rgb, name = askcolor(master=self.__root)
109 if rgb is None:
110 text = 'You hit CANCEL!'
111 else:
112 r, g, b = rgb
113 text = 'You picked %s (%3d/%3d/%3d)' % (name, r, g, b)
114 self.__l.configure(text=text)
116 def __quit(self, event=None):
117 self.__root.quit()
119 def run(self):
120 self.__root.mainloop()
121 t = Tester()
122 t.run()
123 # simpler
124 ## print 'color:', askcolor()
125 ## print 'color:', askcolor()