diff options
-rwxr-xr-x | Tools/webchecker/wsgui.py | 407 |
1 files changed, 203 insertions, 204 deletions
diff --git a/Tools/webchecker/wsgui.py b/Tools/webchecker/wsgui.py index be60650..1bf5f73 100755 --- a/Tools/webchecker/wsgui.py +++ b/Tools/webchecker/wsgui.py @@ -14,231 +14,230 @@ import sys import os import threading import Queue -import time +import time VERBOSE = 2 try: - class Canceled(Exception): - "Exception used to cancel run()." + class Canceled(Exception): + "Exception used to cancel run()." except: - Canceled = __name__ + ".Canceled" + Canceled = __name__ + ".Canceled" class SuckerThread(websucker.Sucker): - stopit = 0 - savedir = None - rootdir = None - - def __init__(self, msgq): - self.msgq = msgq - websucker.Sucker.__init__(self) - self.setflags(verbose=VERBOSE) - self.urlopener.addheaders = [ - ('User-agent', 'websucker/%s' % websucker.__version__), - ] - - def message(self, format, *args): - if args: - format = format%args - ##print format - self.msgq.put(format) - - def run1(self, url): - try: - try: - self.reset() - self.addroot(url) - self.run() - except Canceled: - self.message("[canceled]") - else: - self.message("[done]") - finally: - self.msgq.put(None) - - def savefile(self, text, path): - if self.stopit: - raise Canceled - websucker.Sucker.savefile(self, text, path) - - def getpage(self, url): - 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 - - def XXXaddrobot(self, *args): - pass - - def XXXisallowed(self, *args): - return 1 - + stopit = 0 + savedir = None + rootdir = None + + def __init__(self, msgq): + self.msgq = msgq + websucker.Sucker.__init__(self) + self.setflags(verbose=VERBOSE) + self.urlopener.addheaders = [ + ('User-agent', 'websucker/%s' % websucker.__version__), + ] + + def message(self, format, *args): + if args: + format = format%args + ##print format + self.msgq.put(format) + + def run1(self, url): + try: + try: + self.reset() + self.addroot(url) + self.run() + except Canceled: + self.message("[canceled]") + else: + self.message("[done]") + finally: + self.msgq.put(None) + + def savefile(self, text, path): + if self.stopit: + raise Canceled + websucker.Sucker.savefile(self, text, path) + + def getpage(self, url): + 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 + + def XXXaddrobot(self, *args): + pass + + def XXXisallowed(self, *args): + return 1 class App: - sucker = None - msgq = None - - def __init__(self, top): - 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, exportselection=0) - self.url_entry.grid(row=0, column=1, sticky='we', - columnspan=99) - self.url_entry.focus_set() - self.url_entry.bind("<Key-Return>", self.go) - 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.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') - self.top.update_idletasks() - self.top.grid_propagate(0) - - def message(self, text, *args): - if args: - text = text % args - self.status_label.config(text=text) - - def check_msgq(self): - while not self.msgq.empty(): - msg = self.msgq.get() - if msg is None: - self.go_button.configure(state=NORMAL) - self.auto_button.configure(state=NORMAL) - self.cancel_button.configure(state=DISABLED) - if self.sucker: - self.sucker.stopit = 0 - self.top.bell() - else: - self.message(msg) - self.top.after(100, self.check_msgq) - - def go(self, event=None): - if not self.msgq: - self.msgq = Queue.Queue(0) - self.check_msgq() - if not self.sucker: - self.sucker = SuckerThread(self.msgq) - if self.sucker.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.sucker.savedir = None - else: - self.sucker.savedir = dir - self.sucker.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.message( '[running...]') - self.sucker.stopit = 0 - t = threading.Thread(target=self.sucker.run1, args=(url,)) - t.start() - - def cancel(self): - if self.sucker: - self.sucker.stopit = 1 - self.message("[canceling...]") - - def auto(self): - tries = ['PRIMARY', 'CLIPBOARD'] - text = "" - for t in tries: - try: - text = self.top.selection_get(selection=t) - except TclError: - continue - text = string.strip(text) - if text: - break - 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.go() + sucker = None + msgq = None + + def __init__(self, top): + 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, exportselection=0) + self.url_entry.grid(row=0, column=1, sticky='we', + columnspan=99) + self.url_entry.focus_set() + self.url_entry.bind("<Key-Return>", self.go) + 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.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') + self.top.update_idletasks() + self.top.grid_propagate(0) + + def message(self, text, *args): + if args: + text = text % args + self.status_label.config(text=text) + + def check_msgq(self): + while not self.msgq.empty(): + msg = self.msgq.get() + if msg is None: + self.go_button.configure(state=NORMAL) + self.auto_button.configure(state=NORMAL) + self.cancel_button.configure(state=DISABLED) + if self.sucker: + self.sucker.stopit = 0 + self.top.bell() + else: + self.message(msg) + self.top.after(100, self.check_msgq) + + def go(self, event=None): + if not self.msgq: + self.msgq = Queue.Queue(0) + self.check_msgq() + if not self.sucker: + self.sucker = SuckerThread(self.msgq) + if self.sucker.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.sucker.savedir = None + else: + self.sucker.savedir = dir + self.sucker.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.message( '[running...]') + self.sucker.stopit = 0 + t = threading.Thread(target=self.sucker.run1, args=(url,)) + t.start() + + def cancel(self): + if self.sucker: + self.sucker.stopit = 1 + self.message("[canceling...]") + + def auto(self): + tries = ['PRIMARY', 'CLIPBOARD'] + text = "" + for t in tries: + try: + text = self.top.selection_get(selection=t) + except TclError: + continue + text = string.strip(text) + if text: + break + 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.go() class AppArray: - def __init__(self, top=None): - if not top: - top = Tk() - top.title("websucker GUI") - top.iconname("wsgui") - top.wm_protocol('WM_DELETE_WINDOW', self.exit) - self.top = top - self.appframe = Frame(self.top) - self.appframe.pack(fill='both') - self.applist = [] - self.exit_button = Button(top, text="Exit", command=self.exit) - self.exit_button.pack(side=RIGHT) - self.new_button = Button(top, text="New", command=self.addsucker) - self.new_button.pack(side=LEFT) - self.addsucker() - ##self.applist[0].url_entry.insert(END, "http://www.python.org/doc/essays/") - - def addsucker(self): - self.top.geometry("") - frame = Frame(self.appframe, borderwidth=2, relief=GROOVE) - frame.pack(fill='x') - app = App(frame) - self.applist.append(app) - - done = 0 - - def mainloop(self): - while not self.done: - time.sleep(0.1) - self.top.update() - - def exit(self): - for app in self.applist: - app.cancel() - app.message("[exiting...]") - self.done = 1 + def __init__(self, top=None): + if not top: + top = Tk() + top.title("websucker GUI") + top.iconname("wsgui") + top.wm_protocol('WM_DELETE_WINDOW', self.exit) + self.top = top + self.appframe = Frame(self.top) + self.appframe.pack(fill='both') + self.applist = [] + self.exit_button = Button(top, text="Exit", command=self.exit) + self.exit_button.pack(side=RIGHT) + self.new_button = Button(top, text="New", command=self.addsucker) + self.new_button.pack(side=LEFT) + self.addsucker() + ##self.applist[0].url_entry.insert(END, "http://www.python.org/doc/essays/") + + def addsucker(self): + self.top.geometry("") + frame = Frame(self.appframe, borderwidth=2, relief=GROOVE) + frame.pack(fill='x') + app = App(frame) + self.applist.append(app) + + done = 0 + + def mainloop(self): + while not self.done: + time.sleep(0.1) + self.top.update() + + def exit(self): + for app in self.applist: + app.cancel() + app.message("[exiting...]") + self.done = 1 def main(): - AppArray().mainloop() + AppArray().mainloop() if __name__ == '__main__': main() |