pyqt5的进度条+工作尝试---历经几次放弃。。。。。

因为程序总会卡死(只要不动就不会崩溃)----但是这样不好,百度查了查,可以加个进度条,避免这样的情况发生,

于是一直百度,但是百度上基本都是模拟进度条(只是进度条,很少涉及线程一起用),我也是初学者看不太懂,放弃了几次

 

最后终于解决了(花了几天)

#!/usr/bin/python3
# -*- coding: utf-8 -*-
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys
import time
import qdarkstyle
'''
这只是模仿进度条--其实并没有真的达到进度条功能

很耗时的程序,将到99%停住,直到工作进程结束,但是不至于卡死
耗时几天终于把基本思路搞了,暂时只能一个线程,而且不是很懂
接下来就打算继续------
疑问:每用一次线程就得重新写一个线程类?这样太麻烦了把,有没有办法直接调用现在的线程类,直接改run函数中的工作函数呢


'''
def work1():
    #超级耗时的工作函数,比如抓包1000多条数据
    #模拟耗时
    for i in range(5000000):
        print(i)
#主窗口
class main_w(QMainWindow):
    def __init__(self):
        super().__init__()
        self.UI()

    def UI(self):
        self.te = QPushButton("进度条",self)
        self.layout1 = QHBoxLayout()
        self.setLayout(self.layout1)
        self.layout1.addWidget(self.te)
        self.te.clicked.connect(self.show1)
    def show1(self):
        self.w2 = Bar()
        self.w2.show()


class WorkThread(QThread):
    #实例化一个信号对象
    trigger = pyqtSignal()
    def __int__(self):
        super(WorkThread, self).__init__()
    def run(self):
        #将你工作的函数放到这里来
        #例如
        work1()
        # 循环完毕后发出信号
        self.trigger.emit()

class Bar(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        self.pbar = QProgressBar(self)
        self.timer = QBasicTimer()
        self.btn = QPushButton('正在处理,请等待----', self)
        self.btn.move(40, 80)
        self.main_layout = QGridLayout()
        self.setLayout(self.main_layout)
        self.setFixedSize(500, 50)
        self.main_layout.addWidget(self.pbar, 1, 0)
        self.main_layout.addWidget(self.btn, 1, 1)
        self.setWindowFlags(Qt.FramelessWindowHint)  # 无边框
        self.btn.clicked.connect(self.close)
        self.work()
        self.step = 0
    def timerEvent(self, e):
        if self.step >= 99:
            self.timer.stop()
            return
        self.step = self.step+1
        self.pbar.setValue(self.step)
    def work(self):
        self.btn.setEnabled(False)#不可按
        self.timer.start(100, self)
        self.work_thread = WorkThread()
        self.work_thread.start()
        self.work_thread.trigger.connect(self.stopend)
    def stopend(self):
        if self.step != 99:
            self.temp = 100 - self.step
            while(self.temp):
                self.step = 1 + self.step
                self.pbar.setValue(self.step)
                self.temp-=1
        else:
            self.step += 1
            self.pbar.setValue(self.step)
        time.sleep(1)
        self.btn.setText('完成')
        self.btn.setEnabled(True)  # 可按
        #self.close()#想要让进度条结束后自己消失
if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5())#qss模板
    ex = main_w()#如果想要进度条直接跑---ex = Bar()
    #ex = Bar()
    ex.show()
    sys.exit(app.exec_())

上面还留有一个大问题!!!有朋友会的请帮忙解决,谢谢了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章