summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1998-06-15 12:35:19 (GMT)
committerGuido van Rossum <guido@python.org>1998-06-15 12:35:19 (GMT)
commite3bd82117f3b4037f49d20fb4eb0c85eb7185fed (patch)
treea585754d1a746690960316198272b4ae0d862c42
parentd328a9b5f41b38d6127d697b0f9fb5f85e52adfa (diff)
downloadcpython-e3bd82117f3b4037f49d20fb4eb0c85eb7185fed.zip
cpython-e3bd82117f3b4037f49d20fb4eb0c85eb7185fed.tar.gz
cpython-e3bd82117f3b4037f49d20fb4eb0c85eb7185fed.tar.bz2
Primitive GUI for websucker.
-rwxr-xr-xTools/webchecker/wsgui.py185
1 files changed, 185 insertions, 0 deletions
diff --git a/Tools/webchecker/wsgui.py b/Tools/webchecker/wsgui.py
new file mode 100755
index 0000000..836b5ac
--- /dev/null
+++ b/Tools/webchecker/wsgui.py
@@ -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()