1 """Main Pynche (Pythonically Natural Color and Hue Editor) widget.
3 This window provides the basic decorations, primarily including the menubar.
4 It is used to bring up other windows.
13 # Milliseconds between interrupt checks
19 def __init__(self
, version
, switchboard
, master
=None):
20 self
.__sb
= switchboard
21 self
.__version
= version
24 self
.__detailswin
= None
26 modal
= self
.__modal
= not not master
27 # If a master was given, we are running as a modal dialog servant to
28 # some other application. We rearrange our UI in this case (there's
29 # no File menu and we get `Okay' and `Cancel' buttons), and we do a
30 # grab_set() to make ourselves modal
32 self
.__tkroot
= tkroot
= Toplevel(master
, class_
='Pynche')
36 # Is there already a default root for Tk, say because we're
37 # running under Guido's IDE? :-) Two conditions say no, either the
38 # import fails or _default_root is None.
41 from Tkinter
import _default_root
42 tkroot
= self
.__tkroot
= _default_root
46 tkroot
= self
.__tkroot
= Tk(className
='Pynche')
47 # but this isn't our top level widget, so make it invisible
50 menubar
= self
.__menubar
= Menu(tkroot
)
55 filemenu
= self
.__filemenu
= Menu(menubar
, tearoff
=0)
56 filemenu
.add_command(label
='Quit',
63 viewmenu
= Menu(menubar
, tearoff
=0)
64 viewmenu
.add_command(label
='Text Window...',
65 command
=self
.__popup
_text
,
67 viewmenu
.add_command(label
='Color List Window...',
68 command
=self
.__popup
_listwin
,
70 viewmenu
.add_command(label
='Details Window...',
71 command
=self
.__popup
_details
,
76 helpmenu
= Menu(menubar
, name
='help', tearoff
=0)
77 helpmenu
.add_command(label
='About Pynche...',
78 command
=self
.__popup
_about
,
80 helpmenu
.add_command(label
='Help...',
81 command
=self
.__popup
_usage
,
84 # Tie them all together
87 menubar
.add_cascade(label
='File',
90 menubar
.add_cascade(label
='View',
93 menubar
.add_cascade(label
='Help',
97 # now create the top level window
98 root
= self
.__root
= Toplevel(tkroot
, class_
='Pynche', menu
=menubar
)
99 root
.protocol('WM_DELETE_WINDOW',
100 modal
and self
.__bell
or self
.__quit
)
101 root
.title('Pynche %s' % version
)
102 root
.iconname('Pynche')
103 # Only bind accelerators for the File->Quit menu item if running as a
106 root
.bind('<Alt-q>', self
.__quit
)
107 root
.bind('<Alt-Q>', self
.__quit
)
109 # We're a modal dialog so we have a new row of buttons
110 bframe
= Frame(root
, borderwidth
=1, relief
=RAISED
)
111 bframe
.grid(row
=4, column
=0, columnspan
=2,
114 okay
= Button(bframe
,
117 okay
.pack(side
=LEFT
, expand
=1)
118 cancel
= Button(bframe
,
120 command
=self
.__cancel
)
121 cancel
.pack(side
=LEFT
, expand
=1)
123 def __quit(self
, event
=None):
126 def __bell(self
, event
=None):
129 def __okay(self
, event
=None):
130 self
.__sb
.withdraw_views()
131 self
.__tkroot
.grab_release()
134 def __cancel(self
, event
=None):
138 def __keepalive(self
):
139 # Exercise the Python interpreter regularly so keyboard interrupts get
141 self
.__tkroot
.tk
.createtimerhandler(KEEPALIVE_TIMER
, self
.__keepalive
)
146 self
.__tkroot
.mainloop()
151 def __popup_about(self
, event
=None):
152 from Main
import __version__
153 tkMessageBox
.showinfo('About Pynche ' + __version__
,
156 The PYthonically Natural
160 contact: Barry A. Warsaw
161 email: bwarsaw@python.org''' % __version__
)
163 def __popup_usage(self
, event
=None):
164 if not self
.__helpwin
:
165 self
.__helpwin
= Helpwin(self
.__root
, self
.__quit
)
166 self
.__helpwin
.deiconify()
168 def __popup_text(self
, event
=None):
169 if not self
.__textwin
:
170 from TextViewer
import TextViewer
171 self
.__textwin
= TextViewer(self
.__sb
, self
.__root
)
172 self
.__sb
.add_view(self
.__textwin
)
173 self
.__textwin
.deiconify()
175 def __popup_listwin(self
, event
=None):
176 if not self
.__listwin
:
177 from ListViewer
import ListViewer
178 self
.__listwin
= ListViewer(self
.__sb
, self
.__root
)
179 self
.__sb
.add_view(self
.__listwin
)
180 self
.__listwin
.deiconify()
182 def __popup_details(self
, event
=None):
183 if not self
.__detailswin
:
184 from DetailsViewer
import DetailsViewer
185 self
.__detailswin
= DetailsViewer(self
.__sb
, self
.__root
)
186 self
.__sb
.add_view(self
.__detailswin
)
187 self
.__detailswin
.deiconify()
190 self
.__root
.withdraw()
193 self
.__root
.deiconify()
198 def __init__(self
, master
, quitfunc
):
199 from Main
import __version__
, docstring
200 self
.__root
= root
= Toplevel(master
, class_
='Pynche')
201 root
.protocol('WM_DELETE_WINDOW', self
.__withdraw
)
202 root
.title('Pynche Help Window')
203 root
.iconname('Pynche Help Window')
204 root
.bind('<Alt-q>', quitfunc
)
205 root
.bind('<Alt-Q>', quitfunc
)
206 root
.bind('<Alt-w>', self
.__withdraw
)
207 root
.bind('<Alt-W>', self
.__withdraw
)
209 # more elaborate help is available in the README file
210 readmefile
= os
.path
.join(sys
.path
[0], 'README')
214 fp
= open(readmefile
)
216 # wax the last page, it contains Emacs cruft
217 i
= string
.rfind(contents
, '\f')
219 contents
= string
.rstrip(contents
[:i
])
224 sys
.stderr
.write("Couldn't open Pynche's README, "
225 'using docstring instead.\n')
226 contents
= docstring()
228 self
.__text
= text
= Text(root
, relief
=SUNKEN
,
230 text
.insert(0.0, contents
)
231 scrollbar
= Scrollbar(root
)
232 scrollbar
.pack(fill
=Y
, side
=RIGHT
)
233 text
.pack(fill
=BOTH
, expand
=YES
)
234 text
.configure(yscrollcommand
=(scrollbar
, 'set'))
235 scrollbar
.configure(command
=(text
, 'yview'))
237 def __withdraw(self
, event
=None):
238 self
.__root
.withdraw()
241 self
.__root
.deiconify()