我正在开发一个应用程序来下载网页代码并捕获链接。 它可以工作,但如果我将程序连接到GUI,它会锁定相应的按钮,直到下载完成。
如果我通过一个单独的线程触发下载,为了避免按钮锁定,它只是冻结并且没有完成执行。
这是正常的吗?或者我错过了什么?
下面是代码片段。如果我从一个单独的线程调用grab(),没有任何反应,也没有错误。
函数update_observers()仅通知观察者,而不是其他人。 观察者负责进行任何更改,在这种情况下,重绘GUI。
def grab(self, url):
try:
self._status = 'Downloading page.'
self.update_observers()
inpu = urllib2.urlopen(url)
except URLError, e:
self._status = 'Error: '+ e.reason
self.update_observers()
return None
resp = []
self._status = 'Parsing links'
self.update_observers()
for line in inpu.readlines():
for reg in self._regexes:
links = reg.findall(line)
for link in links:
resp.append(link)
self._status = 'Ready.'
self.update_observers()
return resp
此代码在此处调用:
def grab(self, widget):
t = Thread(target=self.work)
t.setDaemon(True)
t.start()
def work(self):
print "Working"
self.links = None
self.links = self.grabber.grab(self.txtLink.get_text())
for link in self.links:
self.store.append([link])
print "Ok."
如果我将代码从work()移到抓取,删除线程的东西,那就没关系了。
答案 0 :(得分:0)
我在gtk.gdk.threads_init()
之前调用了gtk.main()
,一切都运行良好,没有任何变化。