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

上面還留有一個大問題!!!有朋友會的請幫忙解決,謝謝了

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