因爲程序總會卡死(只要不動就不會崩潰)----但是這樣不好,百度查了查,可以加個進度條,避免這樣的情況發生,
於是一直百度,但是百度上基本都是模擬進度條(只是進度條,很少涉及線程一起用),我也是初學者看不太懂,放棄了幾次
最後終於解決了(花了幾天)
#!/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_())
上面還留有一個大問題!!!有朋友會的請幫忙解決,謝謝了