You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyQt5进度条与外部函数调用同步运行问题求助

问题:PyQt5进度条调用外部函数时冻结

我尝试了各种方法,让PyQt5中创建的进度条在调用外部文件untitled3的gl_dump函数时同步滚动,但每次点击按钮调用该函数时,进度条都会出现冻结情况。

主程序代码

import sys
import time
import untitled3
from untitled3 import gl_dump
from PyQt5.uic import loadUi
from PyQt5 import QtWidgets,QtGui
from PyQt5.QtWidgets import QDialog, QApplication,QMainWindow, QWidget, QHBoxLayout, QProgressBar,QVBoxLayout,QPushButton
from PyQt5.QtCore import QThread, pyqtSignal, QObject, pyqtSlot, QCoreApplication

class Worker(QObject):
    finished = pyqtSignal()
    intReady = pyqtSignal(int)
    @pyqtSlot()
    def proc_counter(self):
      for i in range(1, 101):
            time.sleep(0.5)
            
            self.intReady.emit(i)
           
        self.finished.emit()
            
class PopUpProgressB(QWidget):

    def __init__(self):
        super().__init__()
        self.pbar = QProgressBar(self)
        #self.pbar.setRange(0,0)
        self.pbar.setGeometry(30, 40, 500, 75)
        self.layout = QVBoxLayout()
        self.layout.addWidget(self.pbar)
        self.setLayout(self.layout)
        self.setGeometry(300, 300, 550, 100)
        self.setWindowTitle('Progress Bar')

        self.obj = Worker()
        self.thread = QThread()
        self.obj.intReady.connect(self.on_count_changed)
        
        self.obj.moveToThread(self.thread)
     
        self.obj.finished.connect(self.thread.quit)
        self.obj.finished.connect(self.hide)  # To hide the progress bar after the progress is completed
        self.thread.started.connect(self.obj.proc_counter)
       

    def start_progress(self):
        # To restart the progress every time
        self.show()
        self.thread.start()

    def on_count_changed(self, value):
        self.pbar.setValue(value)
        
class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow,self).__init__()
        loadUi("app_interface.ui",self)
        self.pushButton.clicked.connect(self.gotoScreen2)
        self.screen2=Screen2()
        
    def gotoScreen2(self):
        screen2=Screen2()
        widget.addWidget(screen2)
        widget.setCurrentWidget(screen2)
        
class Screen2(QDialog):
    def __init__(self):
        super(Screen2,self).__init__()
        loadUi("GL_Dump_Curr.ui",self)
        self.pushButton_2.clicked.connect(self.gotoScreen1)
        self.popup=PopUpProgressB()
        self.main_window_button=self.pushButton
        self.btn=self.pushButton
        self.main_window_button.clicked.connect(self.popup.start_progress)
        self.btn.clicked.connect(untitled3.gl_dump)
               
    def gotoScreen1(self):
        mainwindow=MainWindow()
        widget.addWidget(mainwindow)
        widget.setCurrentWidget(mainwindow)
        
if __name__ == '__main__':    
    app = QApplication(sys.argv)
    QApplication.processEvents()
    widget=QtWidgets.QStackedWidget()
    mainwindow=MainWindow()
    widget.addWidget(mainwindow)
    widget.setFixedHeight(300)
    widget.setFixedHeight(400)
    widget.show()

try:
    sys.exit(app.exec_())
except:
    print("Exiting")

外部文件untitled3.py代码

import win32com.client as win32
import time
from datetime import datetime
month=datetime.now().strftime('%B')
excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = True
excel.DisplayAlerts = False
destination=rf"C:\Users\RaphaelC\Desktop\Important Emails\WIP Special Workings\FY2024\{month}"

def gl_dump():
    data_file = rf"C:\Users\RaphaelC\Desktop\Important Emails\WIP Special Workings\FY2024\{month}\gl transaction download-cc1.xlsx"
    template_file=rf"C:\Users\RaphaelC\Desktop\Important Emails\WIP Special Workings\FY2024\{month}\GL Dump - {month}.xlsx"
    wb_template = excel.Workbooks.Open(template_file)
    wb_data = excel.Workbooks.Open(data_file)
    wb_template.Sheets("GL Data Jan").Range("A2:W5000").Clear()
    wb_data.Sheets("Sheet1").Range("A2:W5000").Copy()
    wb_template.Sheets("GL Data Jan").Paste(wb_template.Sheets("GL Data Jan").Range('A2'))
    #excel.Selection.Copy(Destination=wb_template.Worksheets("GL Data Jan").Range("A2"))
    #wb_template.Worksheets("GL Data Jan").Range("A2:W5000").AutoFilter(20)
    wb_template.RefreshAll()
    time.sleep(5)
    wb_template.Save()
    wb_template.Close(True)
    wb_data.Close(True)
    excel.Application.Quit()
    return None

界面截图

PyQt5应用界面截图

内容的提问来源于stack exchange,提问作者Raph Car

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 01:11:11