Pyside / PyQt - 程序没有响应,但在后台工作

时间:2014-11-16 11:44:19

标签: python file-io pyqt beautifulsoup pyside

我创建了一个小程序来获取网站并获取图像并将其保存在目录中。

如果我运行脚本它运行正常,但程序会冻结,直到它下载网站上的每个图像。

这是代码的一部分。

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()

2 个答案:

答案 0 :(得分:1)

正确的解决方案是使用QThread在单独的线程中加载图像。尽管QCoreApplication.processEvents有效,但它并不像使用单独的线程那样健壮(可能是因为您在处理事件时强制处理事件,当多个函数调用它时,该任务不能很好地扩展) 。

使用QThread已在Qt docs online中有详细记录,但如果您无法找到,请发表评论,我会为您找到具体的链接。

答案 1 :(得分:0)

找到解决方案。

在循环中添加: QtCore.QCoreApplication.processEvents()。它设法在再次处理之前更新GUI。