blob: cd5326379d6b1c46a129f3d7e077ef818fa33319 [file] [log] [blame]
Guido van Rossum06981c31997-01-31 18:58:12 +00001#! /usr/bin/env python
2
3"""GUI interface to webchecker.
4
5This works as a Grail applet too! E.g.
6
Guido van Rossum4f6ecda1997-02-01 05:17:29 +00007 <APPLET CODE=wcgui.py NAME=CheckerWindow></APPLET>
Guido van Rossum06981c31997-01-31 18:58:12 +00008
Guido van Rossumaf310c11997-02-02 23:30:32 +00009Checkpoints are not (yet??? ever???) supported.
Guido van Rossum06981c31997-01-31 18:58:12 +000010
11User interface:
12
Tim Peters182b5ac2004-07-18 06:16:08 +000013Enter a root to check in the text entry box. To enter more than one root,
Guido van Rossumaf310c11997-02-02 23:30:32 +000014enter them one at a time and press <Return> for each one.
Guido van Rossum4f6ecda1997-02-01 05:17:29 +000015
Tim Peters182b5ac2004-07-18 06:16:08 +000016Command buttons Start, Stop and "Check one" govern the checking process in
17the obvious way. Start and "Check one" also enter the root from the text
Guido van Rossumaf310c11997-02-02 23:30:32 +000018entry box if one is present. There's also a check box (enabled by default)
19to decide whether actually to follow external links (since this can slow
20the checking down considerably). Finally there's a Quit button.
Guido van Rossum4f6ecda1997-02-01 05:17:29 +000021
Tim Peters182b5ac2004-07-18 06:16:08 +000022A series of checkbuttons determines whether the corresponding output panel
23is shown. List panels are also automatically shown or hidden when their
Guido van Rossum4f6ecda1997-02-01 05:17:29 +000024status changes between empty to non-empty. There are six panels:
Guido van Rossum06981c31997-01-31 18:58:12 +000025
26Log -- raw output from the checker (-v, -q affect this)
Guido van Rossumaf310c11997-02-02 23:30:32 +000027To check -- links discovered but not yet checked
28Checked -- links that have been checked
Guido van Rossum06981c31997-01-31 18:58:12 +000029Bad links -- links that failed upon checking
Guido van Rossumaf310c11997-02-02 23:30:32 +000030Errors -- pages containing at least one bad link
Guido van Rossum06981c31997-01-31 18:58:12 +000031Details -- details about one URL; double click on a URL in any of
Guido van Rossumaf310c11997-02-02 23:30:32 +000032 the above list panels (not in Log) will show details
33 for that URL
Guido van Rossum4f6ecda1997-02-01 05:17:29 +000034
Guido van Rossum06981c31997-01-31 18:58:12 +000035Use your window manager's Close command to quit.
36
37Command line options:
38
39-m bytes -- skip HTML pages larger than this size (default %(MAXPAGE)d)
Guido van Rossum06981c31997-01-31 18:58:12 +000040-q -- quiet operation (also suppresses external links report)
41-v -- verbose operation; repeating -v will increase verbosity
Guido van Rossuma8946401999-11-17 15:03:52 +000042-t root -- specify root dir which should be treated as internal (can repeat)
43-a -- don't check name anchors
Guido van Rossum06981c31997-01-31 18:58:12 +000044
45Command line arguments:
46
47rooturl -- URL to start checking
48 (default %(DEFROOT)s)
49
Guido van Rossumaf310c11997-02-02 23:30:32 +000050XXX The command line options (-m, -q, -v) should be GUI accessible.
Guido van Rossum06981c31997-01-31 18:58:12 +000051
Guido van Rossum4f6ecda1997-02-01 05:17:29 +000052XXX The roots should be visible as a list (?).
Guido van Rossum06981c31997-01-31 18:58:12 +000053
Guido van Rossumaf310c11997-02-02 23:30:32 +000054XXX The multipanel user interface is clumsy.
Guido van Rossum06981c31997-01-31 18:58:12 +000055
56"""
57
58# ' Emacs bait
59
60
61import sys
62import getopt
Guido van Rossum06981c31997-01-31 18:58:12 +000063from Tkinter import *
64import tktools
Guido van Rossum497a1981999-11-17 15:40:48 +000065import webchecker
Guido van Rossum06981c31997-01-31 18:58:12 +000066
Guido van Rossum06981c31997-01-31 18:58:12 +000067def main():
Guido van Rossum06981c31997-01-31 18:58:12 +000068 try:
Guido van Rossuma8946401999-11-17 15:03:52 +000069 opts, args = getopt.getopt(sys.argv[1:], 't:m:qva')
Guido van Rossum06981c31997-01-31 18:58:12 +000070 except getopt.error, msg:
Guido van Rossum986abac1998-04-06 14:29:28 +000071 sys.stdout = sys.stderr
72 print msg
73 print __doc__%vars(webchecker)
74 sys.exit(2)
Guido van Rossuma8946401999-11-17 15:03:52 +000075 webchecker.verbose = webchecker.VERBOSE
76 webchecker.nonames = webchecker.NONAMES
77 webchecker.maxpage = webchecker.MAXPAGE
78 extra_roots = []
Guido van Rossum06981c31997-01-31 18:58:12 +000079 for o, a in opts:
Guido van Rossum986abac1998-04-06 14:29:28 +000080 if o == '-m':
Walter Dörwaldaaab30e2002-09-11 20:36:02 +000081 webchecker.maxpage = int(a)
Guido van Rossum986abac1998-04-06 14:29:28 +000082 if o == '-q':
83 webchecker.verbose = 0
84 if o == '-v':
85 webchecker.verbose = webchecker.verbose + 1
Guido van Rossuma8946401999-11-17 15:03:52 +000086 if o == '-t':
87 extra_roots.append(a)
88 if o == '-a':
89 webchecker.nonames = not webchecker.nonames
Guido van Rossum06981c31997-01-31 18:58:12 +000090 root = Tk(className='Webchecker')
91 root.protocol("WM_DELETE_WINDOW", root.quit)
Guido van Rossum4f6ecda1997-02-01 05:17:29 +000092 c = CheckerWindow(root)
Guido van Rossuma8946401999-11-17 15:03:52 +000093 c.setflags(verbose=webchecker.verbose, maxpage=webchecker.maxpage,
94 nonames=webchecker.nonames)
Guido van Rossum4f6ecda1997-02-01 05:17:29 +000095 if args:
Guido van Rossum986abac1998-04-06 14:29:28 +000096 for arg in args[:-1]:
97 c.addroot(arg)
98 c.suggestroot(args[-1])
Guido van Rossuma8946401999-11-17 15:03:52 +000099 # Usually conditioned on whether external links
100 # will be checked, but since that's not a command
101 # line option, just toss them in.
102 for url_root in extra_roots:
103 # Make sure it's terminated by a slash,
104 # so that addroot doesn't discard the last
105 # directory component.
106 if url_root[-1] != "/":
107 url_root = url_root + "/"
108 c.addroot(url_root, add_to_do = 0)
Guido van Rossum06981c31997-01-31 18:58:12 +0000109 root.mainloop()
110
111
112class CheckerWindow(webchecker.Checker):
113
Guido van Rossum4f6ecda1997-02-01 05:17:29 +0000114 def __init__(self, parent, root=webchecker.DEFROOT):
Guido van Rossum986abac1998-04-06 14:29:28 +0000115 self.__parent = parent
Guido van Rossumaf310c11997-02-02 23:30:32 +0000116
Guido van Rossum986abac1998-04-06 14:29:28 +0000117 self.__topcontrols = Frame(parent)
118 self.__topcontrols.pack(side=TOP, fill=X)
119 self.__label = Label(self.__topcontrols, text="Root URL:")
120 self.__label.pack(side=LEFT)
121 self.__rootentry = Entry(self.__topcontrols, width=60)
122 self.__rootentry.pack(side=LEFT)
123 self.__rootentry.bind('<Return>', self.enterroot)
124 self.__rootentry.focus_set()
Guido van Rossumaf310c11997-02-02 23:30:32 +0000125
Guido van Rossum986abac1998-04-06 14:29:28 +0000126 self.__controls = Frame(parent)
127 self.__controls.pack(side=TOP, fill=X)
128 self.__running = 0
129 self.__start = Button(self.__controls, text="Run", command=self.start)
130 self.__start.pack(side=LEFT)
131 self.__stop = Button(self.__controls, text="Stop", command=self.stop,
132 state=DISABLED)
133 self.__stop.pack(side=LEFT)
134 self.__step = Button(self.__controls, text="Check one",
135 command=self.step)
136 self.__step.pack(side=LEFT)
137 self.__cv = BooleanVar(parent)
138 self.__cv.set(self.checkext)
139 self.__checkext = Checkbutton(self.__controls, variable=self.__cv,
140 command=self.update_checkext,
141 text="Check nonlocal links",)
142 self.__checkext.pack(side=LEFT)
143 self.__reset = Button(self.__controls, text="Start over", command=self.reset)
144 self.__reset.pack(side=LEFT)
145 if __name__ == '__main__': # No Quit button under Grail!
146 self.__quit = Button(self.__controls, text="Quit",
147 command=self.__parent.quit)
148 self.__quit.pack(side=RIGHT)
Guido van Rossumaf310c11997-02-02 23:30:32 +0000149
Guido van Rossum986abac1998-04-06 14:29:28 +0000150 self.__status = Label(parent, text="Status: initial", anchor=W)
151 self.__status.pack(side=TOP, fill=X)
152 self.__checking = Label(parent, text="Idle", anchor=W)
153 self.__checking.pack(side=TOP, fill=X)
154 self.__mp = mp = MultiPanel(parent)
155 sys.stdout = self.__log = LogPanel(mp, "Log")
Guido van Rossuma8946401999-11-17 15:03:52 +0000156 self.__todo = ListPanel(mp, "To check", self, self.showinfo)
157 self.__done = ListPanel(mp, "Checked", self, self.showinfo)
158 self.__bad = ListPanel(mp, "Bad links", self, self.showinfo)
159 self.__errors = ListPanel(mp, "Pages w/ bad links", self, self.showinfo)
Guido van Rossum986abac1998-04-06 14:29:28 +0000160 self.__details = LogPanel(mp, "Details")
Guido van Rossuma8946401999-11-17 15:03:52 +0000161 self.root_seed = None
Guido van Rossum986abac1998-04-06 14:29:28 +0000162 webchecker.Checker.__init__(self)
163 if root:
Walter Dörwaldaaab30e2002-09-11 20:36:02 +0000164 root = str(root).strip()
Guido van Rossum986abac1998-04-06 14:29:28 +0000165 if root:
166 self.suggestroot(root)
167 self.newstatus()
Guido van Rossumaf310c11997-02-02 23:30:32 +0000168
Guido van Rossumaf310c11997-02-02 23:30:32 +0000169 def reset(self):
Guido van Rossum986abac1998-04-06 14:29:28 +0000170 webchecker.Checker.reset(self)
171 for p in self.__todo, self.__done, self.__bad, self.__errors:
172 p.clear()
Guido van Rossuma8946401999-11-17 15:03:52 +0000173 if self.root_seed:
174 self.suggestroot(self.root_seed)
Guido van Rossum4f6ecda1997-02-01 05:17:29 +0000175
176 def suggestroot(self, root):
Guido van Rossum986abac1998-04-06 14:29:28 +0000177 self.__rootentry.delete(0, END)
178 self.__rootentry.insert(END, root)
179 self.__rootentry.select_range(0, END)
Guido van Rossuma8946401999-11-17 15:03:52 +0000180 self.root_seed = root
Guido van Rossum4f6ecda1997-02-01 05:17:29 +0000181
182 def enterroot(self, event=None):
Guido van Rossum986abac1998-04-06 14:29:28 +0000183 root = self.__rootentry.get()
Walter Dörwaldaaab30e2002-09-11 20:36:02 +0000184 root = root.strip()
Guido van Rossum986abac1998-04-06 14:29:28 +0000185 if root:
186 self.__checking.config(text="Adding root "+root)
187 self.__checking.update_idletasks()
188 self.addroot(root)
189 self.__checking.config(text="Idle")
190 try:
191 i = self.__todo.items.index(root)
192 except (ValueError, IndexError):
193 pass
194 else:
195 self.__todo.list.select_clear(0, END)
196 self.__todo.list.select_set(i)
197 self.__todo.list.yview(i)
198 self.__rootentry.delete(0, END)
Guido van Rossum4f6ecda1997-02-01 05:17:29 +0000199
200 def start(self):
Guido van Rossum986abac1998-04-06 14:29:28 +0000201 self.__start.config(state=DISABLED, relief=SUNKEN)
202 self.__stop.config(state=NORMAL)
203 self.__step.config(state=DISABLED)
204 self.enterroot()
205 self.__running = 1
206 self.go()
Guido van Rossum4f6ecda1997-02-01 05:17:29 +0000207
208 def stop(self):
Guido van Rossum986abac1998-04-06 14:29:28 +0000209 self.__stop.config(state=DISABLED, relief=SUNKEN)
210 self.__running = 0
Guido van Rossum4f6ecda1997-02-01 05:17:29 +0000211
212 def step(self):
Guido van Rossum986abac1998-04-06 14:29:28 +0000213 self.__start.config(state=DISABLED)
214 self.__step.config(state=DISABLED, relief=SUNKEN)
215 self.enterroot()
216 self.__running = 0
217 self.dosomething()
Guido van Rossum06981c31997-01-31 18:58:12 +0000218
219 def go(self):
Guido van Rossum986abac1998-04-06 14:29:28 +0000220 if self.__running:
221 self.__parent.after_idle(self.dosomething)
222 else:
223 self.__checking.config(text="Idle")
224 self.__start.config(state=NORMAL, relief=RAISED)
225 self.__stop.config(state=DISABLED, relief=RAISED)
226 self.__step.config(state=NORMAL, relief=RAISED)
Guido van Rossum4f6ecda1997-02-01 05:17:29 +0000227
228 __busy = 0
Guido van Rossum06981c31997-01-31 18:58:12 +0000229
230 def dosomething(self):
Guido van Rossum986abac1998-04-06 14:29:28 +0000231 if self.__busy: return
232 self.__busy = 1
233 if self.todo:
234 l = self.__todo.selectedindices()
235 if l:
236 i = l[0]
237 else:
238 i = 0
239 self.__todo.list.select_set(i)
240 self.__todo.list.yview(i)
241 url = self.__todo.items[i]
Guido van Rossuma8946401999-11-17 15:03:52 +0000242 self.__checking.config(text="Checking "+self.format_url(url))
Guido van Rossum986abac1998-04-06 14:29:28 +0000243 self.__parent.update()
244 self.dopage(url)
245 else:
246 self.stop()
247 self.__busy = 0
248 self.go()
Guido van Rossum06981c31997-01-31 18:58:12 +0000249
250 def showinfo(self, url):
Guido van Rossum986abac1998-04-06 14:29:28 +0000251 d = self.__details
252 d.clear()
Guido van Rossuma8946401999-11-17 15:03:52 +0000253 d.put("URL: %s\n" % self.format_url(url))
Guido van Rossum986abac1998-04-06 14:29:28 +0000254 if self.bad.has_key(url):
255 d.put("Error: %s\n" % str(self.bad[url]))
256 if url in self.roots:
257 d.put("Note: This is a root URL\n")
258 if self.done.has_key(url):
259 d.put("Status: checked\n")
260 o = self.done[url]
261 elif self.todo.has_key(url):
262 d.put("Status: to check\n")
263 o = self.todo[url]
264 else:
265 d.put("Status: unknown (!)\n")
266 o = []
Guido van Rossuma8946401999-11-17 15:03:52 +0000267 if (not url[1]) and self.errors.has_key(url[0]):
Guido van Rossum986abac1998-04-06 14:29:28 +0000268 d.put("Bad links from this page:\n")
Guido van Rossuma8946401999-11-17 15:03:52 +0000269 for triple in self.errors[url[0]]:
Guido van Rossum986abac1998-04-06 14:29:28 +0000270 link, rawlink, msg = triple
Guido van Rossuma8946401999-11-17 15:03:52 +0000271 d.put(" HREF %s" % self.format_url(link))
272 if self.format_url(link) != rawlink: d.put(" (%s)" %rawlink)
Guido van Rossum986abac1998-04-06 14:29:28 +0000273 d.put("\n")
274 d.put(" error %s\n" % str(msg))
275 self.__mp.showpanel("Details")
276 for source, rawlink in o:
277 d.put("Origin: %s" % source)
Guido van Rossuma8946401999-11-17 15:03:52 +0000278 if rawlink != self.format_url(url):
Guido van Rossum986abac1998-04-06 14:29:28 +0000279 d.put(" (%s)" % rawlink)
280 d.put("\n")
281 d.text.yview("1.0")
Guido van Rossum06981c31997-01-31 18:58:12 +0000282
283 def setbad(self, url, msg):
Guido van Rossum986abac1998-04-06 14:29:28 +0000284 webchecker.Checker.setbad(self, url, msg)
285 self.__bad.insert(url)
286 self.newstatus()
Guido van Rossum06981c31997-01-31 18:58:12 +0000287
288 def setgood(self, url):
Guido van Rossum986abac1998-04-06 14:29:28 +0000289 webchecker.Checker.setgood(self, url)
290 self.__bad.remove(url)
291 self.newstatus()
Guido van Rossum06981c31997-01-31 18:58:12 +0000292
Guido van Rossumaf310c11997-02-02 23:30:32 +0000293 def newlink(self, url, origin):
Guido van Rossum986abac1998-04-06 14:29:28 +0000294 webchecker.Checker.newlink(self, url, origin)
295 if self.done.has_key(url):
296 self.__done.insert(url)
297 elif self.todo.has_key(url):
298 self.__todo.insert(url)
299 self.newstatus()
Guido van Rossum06981c31997-01-31 18:58:12 +0000300
301 def markdone(self, url):
Guido van Rossum986abac1998-04-06 14:29:28 +0000302 webchecker.Checker.markdone(self, url)
303 self.__done.insert(url)
304 self.__todo.remove(url)
305 self.newstatus()
Guido van Rossum06981c31997-01-31 18:58:12 +0000306
Guido van Rossumaf310c11997-02-02 23:30:32 +0000307 def seterror(self, url, triple):
Guido van Rossum986abac1998-04-06 14:29:28 +0000308 webchecker.Checker.seterror(self, url, triple)
Guido van Rossuma8946401999-11-17 15:03:52 +0000309 self.__errors.insert((url, ''))
Guido van Rossum986abac1998-04-06 14:29:28 +0000310 self.newstatus()
Guido van Rossumaf310c11997-02-02 23:30:32 +0000311
312 def newstatus(self):
Guido van Rossum986abac1998-04-06 14:29:28 +0000313 self.__status.config(text="Status: "+self.status())
314 self.__parent.update()
Guido van Rossumaf310c11997-02-02 23:30:32 +0000315
Guido van Rossum88b02cf1998-03-05 20:12:18 +0000316 def update_checkext(self):
Guido van Rossum986abac1998-04-06 14:29:28 +0000317 self.checkext = self.__cv.get()
Guido van Rossum88b02cf1998-03-05 20:12:18 +0000318
Guido van Rossum06981c31997-01-31 18:58:12 +0000319
320class ListPanel:
321
Guido van Rossuma8946401999-11-17 15:03:52 +0000322 def __init__(self, mp, name, checker, showinfo=None):
Guido van Rossum986abac1998-04-06 14:29:28 +0000323 self.mp = mp
324 self.name = name
325 self.showinfo = showinfo
Guido van Rossuma8946401999-11-17 15:03:52 +0000326 self.checker = checker
Guido van Rossum986abac1998-04-06 14:29:28 +0000327 self.panel = mp.addpanel(name)
328 self.list, self.frame = tktools.make_list_box(
329 self.panel, width=60, height=5)
330 self.list.config(exportselection=0)
331 if showinfo:
332 self.list.bind('<Double-Button-1>', self.doubleclick)
333 self.items = []
Guido van Rossum06981c31997-01-31 18:58:12 +0000334
Guido van Rossumaf310c11997-02-02 23:30:32 +0000335 def clear(self):
Guido van Rossum986abac1998-04-06 14:29:28 +0000336 self.items = []
337 self.list.delete(0, END)
338 self.mp.hidepanel(self.name)
Guido van Rossumaf310c11997-02-02 23:30:32 +0000339
Guido van Rossum4f6ecda1997-02-01 05:17:29 +0000340 def doubleclick(self, event):
Guido van Rossum986abac1998-04-06 14:29:28 +0000341 l = self.selectedindices()
342 if l:
Guido van Rossuma8946401999-11-17 15:03:52 +0000343 self.showinfo(self.items[l[0]])
Guido van Rossum4f6ecda1997-02-01 05:17:29 +0000344
345 def selectedindices(self):
Guido van Rossum986abac1998-04-06 14:29:28 +0000346 l = self.list.curselection()
347 if not l: return []
Walter Dörwaldaaab30e2002-09-11 20:36:02 +0000348 return map(int, l)
Guido van Rossum06981c31997-01-31 18:58:12 +0000349
350 def insert(self, url):
Guido van Rossum986abac1998-04-06 14:29:28 +0000351 if url not in self.items:
352 if not self.items:
353 self.mp.showpanel(self.name)
354 # (I tried sorting alphabetically, but the display is too jumpy)
355 i = len(self.items)
Guido van Rossuma8946401999-11-17 15:03:52 +0000356 self.list.insert(i, self.checker.format_url(url))
Guido van Rossum986abac1998-04-06 14:29:28 +0000357 self.list.yview(i)
358 self.items.insert(i, url)
Guido van Rossum06981c31997-01-31 18:58:12 +0000359
360 def remove(self, url):
Guido van Rossum986abac1998-04-06 14:29:28 +0000361 try:
362 i = self.items.index(url)
363 except (ValueError, IndexError):
364 pass
365 else:
366 was_selected = i in self.selectedindices()
367 self.list.delete(i)
368 del self.items[i]
369 if not self.items:
370 self.mp.hidepanel(self.name)
371 elif was_selected:
372 if i >= len(self.items):
373 i = len(self.items) - 1
374 self.list.select_set(i)
Guido van Rossum06981c31997-01-31 18:58:12 +0000375
376
377class LogPanel:
378
379 def __init__(self, mp, name):
Guido van Rossum986abac1998-04-06 14:29:28 +0000380 self.mp = mp
381 self.name = name
382 self.panel = mp.addpanel(name)
383 self.text, self.frame = tktools.make_text_box(self.panel, height=10)
384 self.text.config(wrap=NONE)
Guido van Rossum06981c31997-01-31 18:58:12 +0000385
386 def clear(self):
Guido van Rossum986abac1998-04-06 14:29:28 +0000387 self.text.delete("1.0", END)
388 self.text.yview("1.0")
Guido van Rossum06981c31997-01-31 18:58:12 +0000389
Guido van Rossumaf310c11997-02-02 23:30:32 +0000390 def put(self, s):
Guido van Rossum986abac1998-04-06 14:29:28 +0000391 self.text.insert(END, s)
392 if '\n' in s:
393 self.text.yview(END)
Guido van Rossumaf310c11997-02-02 23:30:32 +0000394
Guido van Rossum06981c31997-01-31 18:58:12 +0000395 def write(self, s):
Guido van Rossum986abac1998-04-06 14:29:28 +0000396 self.text.insert(END, s)
397 if '\n' in s:
398 self.text.yview(END)
399 self.panel.update()
Guido van Rossum06981c31997-01-31 18:58:12 +0000400
401
402class MultiPanel:
403
404 def __init__(self, parent):
Guido van Rossum986abac1998-04-06 14:29:28 +0000405 self.parent = parent
406 self.frame = Frame(self.parent)
407 self.frame.pack(expand=1, fill=BOTH)
408 self.topframe = Frame(self.frame, borderwidth=2, relief=RAISED)
409 self.topframe.pack(fill=X)
410 self.botframe = Frame(self.frame)
411 self.botframe.pack(expand=1, fill=BOTH)
412 self.panelnames = []
413 self.panels = {}
Guido van Rossum06981c31997-01-31 18:58:12 +0000414
415 def addpanel(self, name, on=0):
Guido van Rossum986abac1998-04-06 14:29:28 +0000416 v = StringVar(self.parent)
417 if on:
418 v.set(name)
419 else:
420 v.set("")
421 check = Checkbutton(self.topframe, text=name,
422 offvalue="", onvalue=name, variable=v,
423 command=self.checkpanel)
424 check.pack(side=LEFT)
425 panel = Frame(self.botframe)
426 label = Label(panel, text=name, borderwidth=2, relief=RAISED, anchor=W)
427 label.pack(side=TOP, fill=X)
428 t = v, check, panel
429 self.panelnames.append(name)
430 self.panels[name] = t
431 if on:
432 panel.pack(expand=1, fill=BOTH)
433 return panel
Guido van Rossum06981c31997-01-31 18:58:12 +0000434
435 def showpanel(self, name):
Guido van Rossum986abac1998-04-06 14:29:28 +0000436 v, check, panel = self.panels[name]
437 v.set(name)
438 panel.pack(expand=1, fill=BOTH)
Guido van Rossum06981c31997-01-31 18:58:12 +0000439
440 def hidepanel(self, name):
Guido van Rossum986abac1998-04-06 14:29:28 +0000441 v, check, panel = self.panels[name]
442 v.set("")
443 panel.pack_forget()
Guido van Rossum06981c31997-01-31 18:58:12 +0000444
445 def checkpanel(self):
Guido van Rossum986abac1998-04-06 14:29:28 +0000446 for name in self.panelnames:
447 v, check, panel = self.panels[name]
448 panel.pack_forget()
449 for name in self.panelnames:
450 v, check, panel = self.panels[name]
451 if v.get():
452 panel.pack(expand=1, fill=BOTH)
Guido van Rossum06981c31997-01-31 18:58:12 +0000453
454
455if __name__ == '__main__':
456 main()