]> granicus.if.org Git - python/commitdiff
Primitive GUI for websucker.
authorGuido van Rossum <guido@python.org>
Mon, 15 Jun 1998 12:35:19 +0000 (12:35 +0000)
committerGuido van Rossum <guido@python.org>
Mon, 15 Jun 1998 12:35:19 +0000 (12:35 +0000)
Tools/webchecker/wsgui.py [new file with mode: 0755]

diff --git a/Tools/webchecker/wsgui.py b/Tools/webchecker/wsgui.py
new file mode 100755 (executable)
index 0000000..836b5ac
--- /dev/null
@@ -0,0 +1,185 @@
+#! /usr/bin/env python
+
+"""Tkinter-based GUI for websucker.
+
+Easy use: type or paste source URL and destination directory in
+their respective text boxes, click GO or hit return, and presto.
+"""
+
+from Tkinter import *
+import Tkinter
+import string
+import websucker
+import sys
+import os
+
+VERBOSE = 1
+DEFAULT_URL = "http://www.python.org/download/"
+
+
+try:
+       class Canceled(Exception):
+               "Exception used to cancel run()."
+except:
+       Canceled = __name__ + ".Canceled"
+
+
+class App(websucker.Sucker):
+
+       def __init__(self, top=None):
+               websucker.Sucker.__init__(self)
+               self.setflags(verbose=VERBOSE)
+               self.urlopener.addheaders = [
+                       ('User-agent', 'websucker/%s' % websucker.__version__),
+                       ##('Accept', 'text/html'),
+                       ##('Accept', 'text/plain'),
+                       ##('Accept', 'text/*'),
+                       ##('Accept', 'image/gif'),
+                       ##('Accept', 'image/jpeg'),
+                       ##('Accept', 'image/*'),
+                       ##('Accept', '*/*'),
+               ]
+
+               if not top:
+                       top = Tk()
+                       top.title("websucker GUI")
+                       top.iconname("wsgui")
+                       top.wm_protocol('WM_DELETE_WINDOW', self.exit)
+               self.top = top
+               top.columnconfigure(99, weight=1)
+               self.url_label = Label(top, text="URL:")
+               self.url_label.grid(row=0, column=0, sticky='e')
+               self.url_entry = Entry(top, width=60)
+               self.url_entry.insert(END, DEFAULT_URL)
+               self.url_entry.grid(row=0, column=1, sticky='we', columnspan=99)
+               self.dir_label = Label(top, text="Directory:")
+               self.dir_label.grid(row=1, column=0, sticky='e')
+               self.dir_entry = Entry(top)
+               self.dir_entry.grid(row=1, column=1, sticky='we', columnspan=99)
+               self.exit_button = Button(top, text="Exit", command=self.exit)
+               self.exit_button.grid(row=2, column=0, sticky='w')
+               self.go_button = Button(top, text="Go", command=self.go)
+               self.go_button.grid(row=2, column=1, sticky='w')
+               self.cancel_button = Button(top, text="Cancel", command=self.cancel,
+                                           state=DISABLED)
+               self.cancel_button.grid(row=2, column=2, sticky='w')
+               self.auto_button = Button(top, text="Paste+Go", command=self.auto)
+               self.auto_button.grid(row=2, column=3, sticky='w')
+               self.status_label = Label(top, text="[idle]")
+               self.status_label.grid(row=2, column=4, sticky='w')
+               sys.stdout = self
+               self.top.update_idletasks()
+               self.top.grid_propagate(0)
+       
+       def exit(self):
+               self.stopit = 1
+               self.message("[exiting...]")
+               self.top.update_idletasks()
+               self.top.quit()
+       
+       buffer = ""
+       
+       def write(self, text):
+               sys.stderr.write(text)
+               lines = string.split(text, "\n")
+               if len(lines) > 1:
+                       self.buffer = ""
+               self.buffer = self.buffer + lines[-1]
+               if string.strip(self.buffer):
+                       self.message(self.buffer)
+               self.top.update()
+               if self.stopit:
+                       raise Canceled
+       
+       def message(self, text, *args):
+               if args:
+                       text = text % args
+               self.status_label.config(text=text)             
+       stopit = 0
+
+       def go(self):
+               if self.stopit:
+                       return
+               self.url_entry.selection_range(0, END)
+               url = self.url_entry.get()
+               url = string.strip(url)
+               if not url:
+                       self.top.bell()
+                       self.message("[Error: No URL entered]")
+                       return
+               self.rooturl = url
+               dir = string.strip(self.dir_entry.get())
+               if not dir:
+                       self.savedir = None
+               else:
+                       self.savedir = dir
+                       self.rootdir = os.path.dirname(
+                               websucker.Sucker.savefilename(self, url))
+               self.go_button.configure(state=DISABLED)
+               self.auto_button.configure(state=DISABLED)
+               self.cancel_button.configure(state=NORMAL)
+               self.status_label['text'] = '[running...]'
+               self.top.update_idletasks()
+               self.reset()
+               self.addroot(url)
+
+               self.stopit = 0
+               try:
+                       try:
+                               self.run()
+                       except Canceled:
+                               self.message("[canceled]")
+                       else:
+                               self.message("[done]")
+                               self.top.bell()
+               finally:
+                       self.go_button.configure(state=NORMAL)
+                       self.auto_button.configure(state=NORMAL)
+                       self.cancel_button.configure(state=DISABLED)
+                       self.stopit = 0
+       
+       def cancel(self):
+               self.stopit = 1
+               self.message("[canceling...]")
+       
+       def auto(self):
+               text = self.top.selection_get(selection='CLIPBOARD')
+               text = string.strip(text)
+               if not text:
+                       self.top.bell()
+                       self.message("[Error: clipboard is empty]")
+                       return
+               self.url_entry.delete(0, END)
+               self.url_entry.insert(0, text)
+               self.top.update_idletasks()
+               self.go()
+
+       def mainloop(self):
+               self.top.mainloop()
+       
+       def savefile(self, text, path):
+               self.top.update()
+               if self.stopit:
+                       raise Canceled
+               websucker.Sucker.savefile(self, text, path)
+       
+       def getpage(self, url):
+               self.top.update()
+               if self.stopit:
+                       raise Canceled
+               return websucker.Sucker.getpage(self, url)
+       
+       def savefilename(self, url):
+               path = websucker.Sucker.savefilename(self, url)
+               if self.savedir:
+                       n = len(self.rootdir)
+                       if path[:n] == self.rootdir:
+                               path = path[n:]
+                               while path[:1] == os.sep:
+                                       path = path[1:]
+                               path = os.path.join(self.savedir, path)
+               return path
+
+
+if __name__ == '__main__':
+       App().mainloop()