我创建了一个小程序来获取网站并获取图像并将其保存在目录中。
如果我运行脚本它运行正常,但程序会冻结,直到它下载网站上的每个图像。
这是代码的一部分。
def download(self):
# gets the link
thread = self.textbox_thread.text()
try:
page = urllib2.urlopen(thread)
except urllib2.HTTPError:
print 'wrong thread ID'
# parse the HTML
soup = BeautifulSoup(page)
soup = soup.body.find_all('div', attrs={'class':'postContainer replyContainer'})
links = []
for n in soup:
# extracts image links
test = n.find('div', attrs={'class':'fileText'})
if test != None:
link = test.find('a', href=True).get('href')
links.append(link)
for i, link in enumerate(links):
# set the progress bar percentage
value = int((i/ float(len(links)-1)*100))
self.progressBar.setValue(value)
# downloads the image
file = urllib2.urlopen('http:' + link)
# set the filename properly
board_thread = thread.replace("/","_").replace('thread',"").split("org")[1]
name_of_file = board_thread.replace("__","_")[1:] + "_%04d" % (i + 1) + ".jpg"
# saves the file
complete_path = os.path.abspath(self.textbox_path.text()+name_of_file)
output = open(complete_path, 'wb')
output.write(file.read())
output.close()
答案 0 :(得分:1)
正确的解决方案是使用QThread
在单独的线程中加载图像。尽管QCoreApplication.processEvents
有效,但它并不像使用单独的线程那样健壮(可能是因为您在处理事件时强制处理事件,当多个函数调用它时,该任务不能很好地扩展) 。
使用QThread
已在Qt docs online中有详细记录,但如果您无法找到,请发表评论,我会为您找到具体的链接。
答案 1 :(得分:0)
找到解决方案。
在循环中添加: QtCore.QCoreApplication.processEvents()。它设法在再次处理之前更新GUI。