[英]Python PyQt5 Progress Bar is not progressing
所以基本上我有一些程序,用於顯示在后台逐行讀取excel文件的進度。 到目前為止,我有以下代碼:
excelresult.py:
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtCore import Qt, QBasicTimer
import os, sys, xlrd, threading, time, pythoncom
import win32com.client
from time import sleep
from test import MyGlobals
class ExcelCheck(threading.Thread):
progPercent = 0
def __init__(self):
threading.Thread.__init__(self)
self.event = threading.Event()
def run(self):
pythoncom.CoInitialize()
try:
while not self.event.is_set():
excel = win32com.client.Dispatch("Excel.Application")
wb = excel.ActiveWorkbook
ws = wb.Worksheets("TC")
va_title = ws.Range(ws.Range('I7'), ws.Range('I700'))
i = 0
for r in va_title.Cells:
if r.Text != '':
i = i + 1
# print(r.Text)
# print(i)
# print(round(i / 178.0 * 100,0))
# rounding off
progPercent = round(i / 178.0 * 100.0)
MyGlobals.x=progPercent
print(progPercent)
return progPercent
except:
print('Excel is not executed')
# sleep(1)
# self.event.wait()
def stop(self):
self.event.set()
scm.py
# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtCore import QObject, pyqtSignal
from PyQt5.QtCore import Qt, QBasicTimer
import os, sys, xlrd, win32com.client, xlwt, threading, time
from time import sleep
from ExcelResult import *
from test import MyGlobals
import threading
class Ui_MainWindow(object):
def __init__(self):
super().__init__()
self.btn_active = False
print('init_false')
def startBtnClicked(self):
self.btnStart.setText('start!')
self.btn_active = True
print(self.btn_active)
tmr = ExcelCheck()
tmr.start()
while(MyGlobals.x<=100):
#print (MyGlobals.x)
self.progressBar.setValue(MyGlobals.x)
# self.progressBar.minimum = 1
# self.progressBar.maximum = 100
# for progPercent in range(1, 101):
# self.progressBar.setValue(progPercent)
# time.sleep(1)
def exitBtnClicked(self):
# self.ExcelCheck()
self.btn_active = False
print(self.btn_active)
# os.system("taskkill /f /im Scm21.Client.exe")
# self.close()
# Stop the progress of python
self.sys.exit()
tmr = ExcelCheck()
tmr.stop()
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(446, 207)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.progressBar = QtWidgets.QProgressBar(self.centralwidget)
self.progressBar.setGeometry(QtCore.QRect(40, 70, 381, 23))
self.progressBar.setProperty("value", 0)
self.progressBar.setObjectName("progressBar")
self.btnStart = QtWidgets.QPushButton(self.centralwidget)
self.btnStart.setGeometry(QtCore.QRect(110, 110, 75, 23))
self.btnStart.setObjectName("btnStart")
self.btnStart.clicked.connect(self.startBtnClicked)
self.btnExit = QtWidgets.QPushButton(self.centralwidget)
self.btnExit.setGeometry(QtCore.QRect(260, 110, 75, 23))
self.btnExit.setObjectName("btnExit")
self.btnExit.clicked.connect(self.exitBtnClicked)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 446, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "SCM21"))
self.btnStart.setText(_translate("MainWindow", "Start"))
self.btnExit.setText(_translate("MainWindow", "Exit"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
和,test.py
class MyGlobals(object):
x = 0
所以,我能夠使用test.py從ExcelResult.py獲取ProgPercent的值到scm.py,但完全不知道我將如何更新進度條值。
我嘗試使用循環,但它掛起了GUI。
謝謝。
使用Qthread:
import time
from PyQt5 import QtCore
from PyQt5 import QtWidgets
class ExcelCheck(QtCore.QThread):
updated = QtCore.pyqtSignal(int)
running = False
def __init__(self, parent=None):
super(ExcelCheck, self).__init__(parent)
self.progPercent = 0
self.running = True
def run(self):
while self.running:
self.progPercent += 1
self.progPercent %= 100
self.updated.emit(int(self.progPercent))
time.sleep(0.1)
def stop(self):
self.running = False
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent=parent)
self.setupUi(self)
self.btn_active = False
def startBtnClicked(self):
self.btnStart.setText('start!')
self.btn_active = True
self.tmr = ExcelCheck(self)
self.tmr.updated.connect(self.updateValue)
self.tmr.start()
def updateValue(self, data):
self.progressBar.setValue(data)
def exitBtnClicked(self):
# self.ExcelCheck()
self.btn_active = False
self.tmr.stop()
self.sys.exit()
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(446, 207)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.progressBar = QtWidgets.QProgressBar(self.centralwidget)
self.progressBar.setGeometry(QtCore.QRect(40, 70, 381, 23))
self.progressBar.setProperty("value", 0)
self.progressBar.setObjectName("progressBar")
self.btnStart = QtWidgets.QPushButton(self.centralwidget)
self.btnStart.setGeometry(QtCore.QRect(110, 110, 75, 23))
self.btnStart.setObjectName("btnStart")
self.btnStart.clicked.connect(self.startBtnClicked)
self.btnExit = QtWidgets.QPushButton(self.centralwidget)
self.btnExit.setGeometry(QtCore.QRect(260, 110, 75, 23))
self.btnExit.setObjectName("btnExit")
self.btnExit.clicked.connect(self.exitBtnClicked)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 446, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "SCM21"))
self.btnStart.setText(_translate("MainWindow", "Start"))
self.btnExit.setText(_translate("MainWindow", "Exit"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.