下载进度条显示,进度条显示,#!/usr/bin/p
#!/usr/bin/python# -*- coding: utf-8 -*-from threading import Threadimport sys, time, randomfrom PyQt4 import QtGuifrom PyQt4 import QtCoreDEFAULT_STYLE = """QProgressBar{ border: 2px solid grey; border-radius: 5px; text-align: center}QProgressBar::chunk { background-color: lightblue; width: 10px; margin: 1px;}"""COMPLETED_STYLE = """QProgressBar{ border: 2px solid grey; border-radius: 5px; text-align: center}QProgressBar::chunk { background-color: #CD96CD; width: 10px; margin: 1px;}"""class XProgressBar(QtGui.QProgressBar): def __init__(self, parent = None): QtGui.QProgressBar.__init__(self, parent) self.setStyleSheet(DEFAULT_STYLE) self.step = 0 def setValue(self, value): QtGui.QProgressBar.setValue(self, value) if value == self.maximum(): self.setStyleSheet(COMPLETED_STYLE)class DownloadThread(Thread): def __init__(self, job): Thread.__init__(self) self.job = job def run(self): global JOBS while self.job.BAR.step < 100 and self.job.stauts=='run': self.job.BAR.step += 1 time.sleep(random.randint(0, 1)) else: self.job.stauts=='done'class O(dict): def __getattr__(self, name): try: return self[name] except KeyError: raise AttributeError(name)# ID, RUL, Path, BAR, OPTJOBS = [ O({'ID':1, "URL":'http://1', "Path":"C:/", "BAR":None, "OPT":None, "_dt":None, "stauts":"stop", "threads":4, "dinfo":None}), O({'ID':2, "URL":'http://2', "Path":"C:/", "BAR":None, "OPT":None, "_dt":None, "stauts":"stop", "threads":4, "dinfo":None}), O({'ID':3, "URL":'http://3', "Path":"C:/", "BAR":None, "OPT":None, "_dt":None, "stauts":"stop", "threads":4, "dinfo":None}), O({'ID':4, "URL":'http://4', "Path":"C:/", "BAR":None, "OPT":None, "_dt":None, "stauts":"stop", "threads":4, "dinfo":None}),]class dInfo(QtCore.QThread): _bar = QtCore.pyqtSignal(object) def __init__(self, ui, job): QtCore.QThread.__init__(self) self.running = True self.job = job self._bar.connect(ui.update_bar_info) self.start() def run(self): global JOBS while self.running and self.job.BAR is not None and self.job.stauts=='run': self._bar.emit(self.job.BAR) self.sleep(random.randint(0, 1)) else: self.terminate()class Example(QtGui.QWidget): def __init__(self): super(Example, self).__init__() self.threads = [] self.initUI() def initUI(self): global JOBS lab = ['URL','Progress','Time Remaining','Cur Speed','Avg Speed','Path','Size', 'ProgressBar', 'Opt'] self.dltable = QtGui.QTableWidget(len(JOBS), len(lab)) self.dltable.setHorizontalHeaderLabels(lab) for i, d in enumerate(JOBS): self.dltable.setItem(i, 0, QtGui.QTableWidgetItem(d.URL)) self.dltable.setItem(i, 1, QtGui.QTableWidgetItem('')) self.dltable.setItem(i, 2, QtGui.QTableWidgetItem('')) self.dltable.setItem(i, 3, QtGui.QTableWidgetItem('')) self.dltable.setItem(i, 4, QtGui.QTableWidgetItem('')) self.dltable.setItem(i, 5, QtGui.QTableWidgetItem(d.Path)) self.dltable.setItem(i, 6, QtGui.QTableWidgetItem('')) bar = XProgressBar(self) d.BAR = bar self.dltable.setCellWidget(i, 7, bar) opt = QtGui.QPushButton('Opt', self) self.connect(opt, QtCore.SIGNAL('clicked()'), self.doAction) d.OPT = opt self.dltable.setCellWidget(i, 8, opt) self.button = QtGui.QPushButton('Start', self) self.button.setFocusPolicy(QtCore.Qt.NoFocus) self.connect(self.button, QtCore.SIGNAL('clicked()'), self.doAllAction) layout = QtGui.QGridLayout() layout.addWidget(self.dltable, 0, 0) layout.addWidget(self.button, 1, 0) self.setLayout(layout) self.setWindowTitle('ProgressBar') self.setGeometry(300, 300, 950, 450) def update_bar_info(self, bar): if bar.step <= 100: bar.setValue(bar.step) def doAction(self): global JOBS _but = self.sender() for d in JOBS: if _but == d.OPT: self.create(d) def create(self, d, all=False): if d.stauts=='stop': _download = DownloadThread(d) d._dt = _download d.stauts = 'run' _download.start() d.OPT.setText('Stop') _dInfo = dInfo(self, d) self.threads.append(_dInfo) d.dinfo = _dInfo elif d.stauts == 'run': d.stauts = 'stop' # d.dinfo.stop() d.OPT.setText('Start') def initDownload(self): global JOBS for d in JOBS: if d._dt is None: self.create(d) def doAllAction(self): self.initDownload() def closeEvent(self, event): reply = QtGui.QMessageBox.question(self, u"关闭系统", u"确定关闭系统吗?", QtGui.QMessageBox.Yes|QtGui.QMessageBox.No) if reply == QtGui.QMessageBox.Yes: self.dInfo.running = False event.accept() elif reply == QtGui.QMessageBox.No: event.ignore()if __name__ == '__main__': app = QtGui.QApplication(sys.argv) ex = Example() ex.show() app.exec_()#该片段来自于http://byrx.net
评论关闭