3 """Tkinter-based GUI for websucker.
5 Easy use: type or paste source URL and destination directory in
6 their respective text boxes, click GO or hit return, and presto.
23 class Canceled(Exception):
24 "Exception used to cancel run()."
25 except (NameError, TypeError):
26 Canceled
= __name__
+ ".Canceled"
29 class SuckerThread(websucker
.Sucker
):
35 def __init__(self
, msgq
):
37 websucker
.Sucker
.__init
__(self
)
38 self
.setflags(verbose
=VERBOSE
)
39 self
.urlopener
.addheaders
= [
40 ('User-agent', 'websucker/%s' % websucker
.__version
__),
43 def message(self
, format
, *args
):
56 self
.message("[canceled]")
58 self
.message("[done]")
62 def savefile(self
, text
, path
):
65 websucker
.Sucker
.savefile(self
, text
, path
)
67 def getpage(self
, url
):
70 return websucker
.Sucker
.getpage(self
, url
)
72 def savefilename(self
, url
):
73 path
= websucker
.Sucker
.savefilename(self
, url
)
76 if path
[:n
] == self
.rootdir
:
78 while path
[:1] == os
.sep
:
80 path
= os
.path
.join(self
.savedir
, path
)
83 def XXXaddrobot(self
, *args
):
86 def XXXisallowed(self
, *args
):
95 def __init__(self
, top
):
97 top
.columnconfigure(99, weight
=1)
98 self
.url_label
= Label(top
, text
="URL:")
99 self
.url_label
.grid(row
=0, column
=0, sticky
='e')
100 self
.url_entry
= Entry(top
, width
=60, exportselection
=0)
101 self
.url_entry
.grid(row
=0, column
=1, sticky
='we',
103 self
.url_entry
.focus_set()
104 self
.url_entry
.bind("<Key-Return>", self
.go
)
105 self
.dir_label
= Label(top
, text
="Directory:")
106 self
.dir_label
.grid(row
=1, column
=0, sticky
='e')
107 self
.dir_entry
= Entry(top
)
108 self
.dir_entry
.grid(row
=1, column
=1, sticky
='we',
110 self
.go_button
= Button(top
, text
="Go", command
=self
.go
)
111 self
.go_button
.grid(row
=2, column
=1, sticky
='w')
112 self
.cancel_button
= Button(top
, text
="Cancel",
115 self
.cancel_button
.grid(row
=2, column
=2, sticky
='w')
116 self
.auto_button
= Button(top
, text
="Paste+Go",
118 self
.auto_button
.grid(row
=2, column
=3, sticky
='w')
119 self
.status_label
= Label(top
, text
="[idle]")
120 self
.status_label
.grid(row
=2, column
=4, sticky
='w')
121 self
.top
.update_idletasks()
122 self
.top
.grid_propagate(0)
124 def message(self
, text
, *args
):
127 self
.status_label
.config(text
=text
)
129 def check_msgq(self
):
130 while not self
.msgq
.empty():
131 msg
= self
.msgq
.get()
133 self
.go_button
.configure(state
=NORMAL
)
134 self
.auto_button
.configure(state
=NORMAL
)
135 self
.cancel_button
.configure(state
=DISABLED
)
137 self
.sucker
.stopit
= 0
141 self
.top
.after(100, self
.check_msgq
)
143 def go(self
, event
=None):
145 self
.msgq
= Queue
.Queue(0)
148 self
.sucker
= SuckerThread(self
.msgq
)
149 if self
.sucker
.stopit
:
151 self
.url_entry
.selection_range(0, END
)
152 url
= self
.url_entry
.get()
153 url
= string
.strip(url
)
156 self
.message("[Error: No URL entered]")
159 dir = string
.strip(self
.dir_entry
.get())
161 self
.sucker
.savedir
= None
163 self
.sucker
.savedir
= dir
164 self
.sucker
.rootdir
= os
.path
.dirname(
165 websucker
.Sucker
.savefilename(self
, url
))
166 self
.go_button
.configure(state
=DISABLED
)
167 self
.auto_button
.configure(state
=DISABLED
)
168 self
.cancel_button
.configure(state
=NORMAL
)
169 self
.message( '[running...]')
170 self
.sucker
.stopit
= 0
171 t
= threading
.Thread(target
=self
.sucker
.run1
, args
=(url
,))
176 self
.sucker
.stopit
= 1
177 self
.message("[canceling...]")
180 tries
= ['PRIMARY', 'CLIPBOARD']
184 text
= self
.top
.selection_get(selection
=t
)
187 text
= string
.strip(text
)
192 self
.message("[Error: clipboard is empty]")
194 self
.url_entry
.delete(0, END
)
195 self
.url_entry
.insert(0, text
)
201 def __init__(self
, top
=None):
204 top
.title("websucker GUI")
205 top
.iconname("wsgui")
206 top
.wm_protocol('WM_DELETE_WINDOW', self
.exit
)
208 self
.appframe
= Frame(self
.top
)
209 self
.appframe
.pack(fill
='both')
211 self
.exit_button
= Button(top
, text
="Exit", command
=self
.exit
)
212 self
.exit_button
.pack(side
=RIGHT
)
213 self
.new_button
= Button(top
, text
="New", command
=self
.addsucker
)
214 self
.new_button
.pack(side
=LEFT
)
216 ##self.applist[0].url_entry.insert(END, "http://www.python.org/doc/essays/")
219 self
.top
.geometry("")
220 frame
= Frame(self
.appframe
, borderwidth
=2, relief
=GROOVE
)
223 self
.applist
.append(app
)
233 for app
in self
.applist
:
235 app
.message("[exiting...]")
240 AppArray().mainloop()
242 if __name__
== '__main__':