# *NOT* by Sam Bayer: reindented to use 4 spaces like the rest here,

# and removed trailing whitespace.
This commit is contained in:
Guido van Rossum 1999-11-17 15:13:21 +00:00
parent 64acb5ce93
commit 61b95db389
1 changed files with 190 additions and 191 deletions

View File

@ -14,231 +14,230 @@ import sys
import os import os
import threading import threading
import Queue import Queue
import time import time
VERBOSE = 2 VERBOSE = 2
try: try:
class Canceled(Exception): class Canceled(Exception):
"Exception used to cancel run()." "Exception used to cancel run()."
except: except:
Canceled = __name__ + ".Canceled" Canceled = __name__ + ".Canceled"
class SuckerThread(websucker.Sucker): class SuckerThread(websucker.Sucker):
stopit = 0 stopit = 0
savedir = None savedir = None
rootdir = None rootdir = None
def __init__(self, msgq): def __init__(self, msgq):
self.msgq = msgq self.msgq = msgq
websucker.Sucker.__init__(self) websucker.Sucker.__init__(self)
self.setflags(verbose=VERBOSE) self.setflags(verbose=VERBOSE)
self.urlopener.addheaders = [ self.urlopener.addheaders = [
('User-agent', 'websucker/%s' % websucker.__version__), ('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): def message(self, format, *args):
try: if args:
try: format = format%args
self.reset() ##print format
self.addroot(url) self.msgq.put(format)
self.run()
except Canceled:
self.message("[canceled]")
else:
self.message("[done]")
finally:
self.msgq.put(None)
def savefile(self, text, path): def run1(self, url):
if self.stopit: try:
raise Canceled try:
websucker.Sucker.savefile(self, text, path) self.reset()
self.addroot(url)
def getpage(self, url): self.run()
if self.stopit: except Canceled:
raise Canceled self.message("[canceled]")
return websucker.Sucker.getpage(self, url) else:
self.message("[done]")
def savefilename(self, url): finally:
path = websucker.Sucker.savefilename(self, url) self.msgq.put(None)
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): def savefile(self, text, path):
pass if self.stopit:
raise Canceled
websucker.Sucker.savefile(self, text, path)
def XXXisallowed(self, *args): def getpage(self, url):
return 1 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: class App:
sucker = None sucker = None
msgq = None msgq = None
def __init__(self, top): def __init__(self, top):
self.top = top self.top = top
top.columnconfigure(99, weight=1) top.columnconfigure(99, weight=1)
self.url_label = Label(top, text="URL:") self.url_label = Label(top, text="URL:")
self.url_label.grid(row=0, column=0, sticky='e') self.url_label.grid(row=0, column=0, sticky='e')
self.url_entry = Entry(top, width=60, exportselection=0) self.url_entry = Entry(top, width=60, exportselection=0)
self.url_entry.grid(row=0, column=1, sticky='we', self.url_entry.grid(row=0, column=1, sticky='we',
columnspan=99) columnspan=99)
self.url_entry.focus_set() self.url_entry.focus_set()
self.url_entry.bind("<Key-Return>", self.go) self.url_entry.bind("<Key-Return>", self.go)
self.dir_label = Label(top, text="Directory:") self.dir_label = Label(top, text="Directory:")
self.dir_label.grid(row=1, column=0, sticky='e') self.dir_label.grid(row=1, column=0, sticky='e')
self.dir_entry = Entry(top) self.dir_entry = Entry(top)
self.dir_entry.grid(row=1, column=1, sticky='we', self.dir_entry.grid(row=1, column=1, sticky='we',
columnspan=99) columnspan=99)
self.go_button = Button(top, text="Go", command=self.go) self.go_button = Button(top, text="Go", command=self.go)
self.go_button.grid(row=2, column=1, sticky='w') self.go_button.grid(row=2, column=1, sticky='w')
self.cancel_button = Button(top, text="Cancel", self.cancel_button = Button(top, text="Cancel",
command=self.cancel, command=self.cancel,
state=DISABLED) state=DISABLED)
self.cancel_button.grid(row=2, column=2, sticky='w') self.cancel_button.grid(row=2, column=2, sticky='w')
self.auto_button = Button(top, text="Paste+Go", self.auto_button = Button(top, text="Paste+Go",
command=self.auto) command=self.auto)
self.auto_button.grid(row=2, column=3, sticky='w') self.auto_button.grid(row=2, column=3, sticky='w')
self.status_label = Label(top, text="[idle]") self.status_label = Label(top, text="[idle]")
self.status_label.grid(row=2, column=4, sticky='w') self.status_label.grid(row=2, column=4, sticky='w')
self.top.update_idletasks() self.top.update_idletasks()
self.top.grid_propagate(0) self.top.grid_propagate(0)
def message(self, text, *args): def message(self, text, *args):
if args: if args:
text = text % args text = text % args
self.status_label.config(text=text) self.status_label.config(text=text)
def check_msgq(self): def check_msgq(self):
while not self.msgq.empty(): while not self.msgq.empty():
msg = self.msgq.get() msg = self.msgq.get()
if msg is None: if msg is None:
self.go_button.configure(state=NORMAL) self.go_button.configure(state=NORMAL)
self.auto_button.configure(state=NORMAL) self.auto_button.configure(state=NORMAL)
self.cancel_button.configure(state=DISABLED) self.cancel_button.configure(state=DISABLED)
if self.sucker: if self.sucker:
self.sucker.stopit = 0 self.sucker.stopit = 0
self.top.bell() self.top.bell()
else: else:
self.message(msg) self.message(msg)
self.top.after(100, self.check_msgq) self.top.after(100, self.check_msgq)
def go(self, event=None): def go(self, event=None):
if not self.msgq: if not self.msgq:
self.msgq = Queue.Queue(0) self.msgq = Queue.Queue(0)
self.check_msgq() self.check_msgq()
if not self.sucker: if not self.sucker:
self.sucker = SuckerThread(self.msgq) self.sucker = SuckerThread(self.msgq)
if self.sucker.stopit: if self.sucker.stopit:
return return
self.url_entry.selection_range(0, END) self.url_entry.selection_range(0, END)
url = self.url_entry.get() url = self.url_entry.get()
url = string.strip(url) url = string.strip(url)
if not url: if not url:
self.top.bell() self.top.bell()
self.message("[Error: No URL entered]") self.message("[Error: No URL entered]")
return return
self.rooturl = url self.rooturl = url
dir = string.strip(self.dir_entry.get()) dir = string.strip(self.dir_entry.get())
if not dir: if not dir:
self.sucker.savedir = None self.sucker.savedir = None
else: else:
self.sucker.savedir = dir self.sucker.savedir = dir
self.sucker.rootdir = os.path.dirname( self.sucker.rootdir = os.path.dirname(
websucker.Sucker.savefilename(self, url)) websucker.Sucker.savefilename(self, url))
self.go_button.configure(state=DISABLED) self.go_button.configure(state=DISABLED)
self.auto_button.configure(state=DISABLED) self.auto_button.configure(state=DISABLED)
self.cancel_button.configure(state=NORMAL) self.cancel_button.configure(state=NORMAL)
self.message( '[running...]') self.message( '[running...]')
self.sucker.stopit = 0 self.sucker.stopit = 0
t = threading.Thread(target=self.sucker.run1, args=(url,)) t = threading.Thread(target=self.sucker.run1, args=(url,))
t.start() t.start()
def cancel(self): def cancel(self):
if self.sucker: if self.sucker:
self.sucker.stopit = 1 self.sucker.stopit = 1
self.message("[canceling...]") self.message("[canceling...]")
def auto(self): def auto(self):
tries = ['PRIMARY', 'CLIPBOARD'] tries = ['PRIMARY', 'CLIPBOARD']
text = "" text = ""
for t in tries: for t in tries:
try: try:
text = self.top.selection_get(selection=t) text = self.top.selection_get(selection=t)
except TclError: except TclError:
continue continue
text = string.strip(text) text = string.strip(text)
if text: if text:
break break
if not text: if not text:
self.top.bell() self.top.bell()
self.message("[Error: clipboard is empty]") self.message("[Error: clipboard is empty]")
return return
self.url_entry.delete(0, END) self.url_entry.delete(0, END)
self.url_entry.insert(0, text) self.url_entry.insert(0, text)
self.go() self.go()
class AppArray: class AppArray:
def __init__(self, top=None): def __init__(self, top=None):
if not top: if not top:
top = Tk() top = Tk()
top.title("websucker GUI") top.title("websucker GUI")
top.iconname("wsgui") top.iconname("wsgui")
top.wm_protocol('WM_DELETE_WINDOW', self.exit) top.wm_protocol('WM_DELETE_WINDOW', self.exit)
self.top = top self.top = top
self.appframe = Frame(self.top) self.appframe = Frame(self.top)
self.appframe.pack(fill='both') self.appframe.pack(fill='both')
self.applist = [] self.applist = []
self.exit_button = Button(top, text="Exit", command=self.exit) self.exit_button = Button(top, text="Exit", command=self.exit)
self.exit_button.pack(side=RIGHT) self.exit_button.pack(side=RIGHT)
self.new_button = Button(top, text="New", command=self.addsucker) self.new_button = Button(top, text="New", command=self.addsucker)
self.new_button.pack(side=LEFT) self.new_button.pack(side=LEFT)
self.addsucker() self.addsucker()
##self.applist[0].url_entry.insert(END, "http://www.python.org/doc/essays/") ##self.applist[0].url_entry.insert(END, "http://www.python.org/doc/essays/")
def addsucker(self): def addsucker(self):
self.top.geometry("") self.top.geometry("")
frame = Frame(self.appframe, borderwidth=2, relief=GROOVE) frame = Frame(self.appframe, borderwidth=2, relief=GROOVE)
frame.pack(fill='x') frame.pack(fill='x')
app = App(frame) app = App(frame)
self.applist.append(app) self.applist.append(app)
done = 0 done = 0
def mainloop(self): def mainloop(self):
while not self.done: while not self.done:
time.sleep(0.1) time.sleep(0.1)
self.top.update() self.top.update()
def exit(self): def exit(self):
for app in self.applist: for app in self.applist:
app.cancel() app.cancel()
app.message("[exiting...]") app.message("[exiting...]")
self.done = 1 self.done = 1
def main(): def main():
AppArray().mainloop() AppArray().mainloop()
if __name__ == '__main__': if __name__ == '__main__':
main() main()