Python PyQt5 进度条没有进展

标签 python python-3.x pyqt5

所以基本上我有一些程序旨在显示在后台逐行读取 excel 文件的进度。到目前为止,我有以下代码:

excel 结果.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。

谢谢。

最佳答案

使用Q线程:

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

关于Python PyQt5 进度条没有进展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41350877/

相关文章:

python - 按钮自动调整大小

python - 如何在 Pycharm 中向下/向上移动方法?

python - 一个递归函数,用于检查 int 列表是否按升序排序

带女服务员的 Python Dash 服务器

python-3.x - 如何通过Python使用selenium点击隐藏按钮

python - skimage 调整大小更改数组的总和

python - 使用 pylupdate 消除 QT_TRANSLATE_NOOP 歧义

python - SQLalchemy 未知值重复条目错误

python - 模块未找到错误 : No module named 'tensorflow.examples'

python - “selectedFilters”不是有效的关键字参数