简体   繁体   English

Python PyQt5进度条没有进展

[英]Python PyQt5 Progress Bar is not progressing

so basically i have programs that are meant to show the progress of reading an excel file line by line in the background. 所以基本上我有一些程序,用于显示在后台逐行读取excel文件的进度。 So far i have the following code: 到目前为止,我有以下代码:

excelresult.py: 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 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_())

and, test.py 和,test.py

class MyGlobals(object):
    x = 0

So, i am able to get the value of the ProgPercent from the ExcelResult.py into the scm.py using the test.py but completely not aware how would i update the progressbar value. 所以,我能够使用test.py从ExcelResult.py获取ProgPercent的值到scm.py,但完全不知道我将如何更新进度条值。

I tried using a loop but it hangs the GUI. 我尝试使用循环,但它挂起了GUI。

Thanks. 谢谢。

Use Qthread: 使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM