强制python脚本不要等待vbamacros终止

我从python脚本运行一个长的excel VBAmacros(大约10-15分钟)。 我想为最终用户做一个进度条。 为了从macros到python脚本进行通信,我尝试在txt文件中写入VBAmacros的进度百分比,并将该数字插入到我的.py中的progressBar(使用Qt完成)。问题是: py脚本等待macrosfinsih读取.txt文件的值。 我正在寻找一种方法来强制Python去下一个命令,而不用等待macros完成。 这里是.py我用过的不成功

from PyQt4 import QtGui, QtCore import sys import progress import win32com.client class Progress(QtGui.QDialog, progress.Ui_Progress): def __init__(self, parent=None): super(Progress, self).__init__(parent) self.setupUi(self) self.progressBar.setValue(0) def main(self): self.show() def evolution(self, a): self.progressBar.setValue(a) if __name__=='__main__': app = QtGui.QApplication(sys.argv) progress = Progress() progress.main() xl=win32com.client.Dispatch("Excel.Application") xl.Workbooks.Open(Filename="filename",ReadOnly=1) xl.Application.ScreenUpdating = False xl.Application.Run("myscript") while a < 100 file = open('newfile.txt', 'r') a = int(file.read()) progress.evolution(a) file.close() app.exec_() def main(): pass 

为什么不创build用户表单作为进度条,直接从Excel VBA代码调用?

http://www.ehow.com/how_7764247_create-progress-bar-vba.html

如果您不想在VB脚本中创build进度条,请按照其他人的build议,使用线程。 我认为改变VBA是一个更好的主意,但是如果你真的因为某种原因而反对,下面的改变应该是有效的:

 import threading import time ... # imports, progress class unchanged # probably want to add arguments to make generic, but not required def run_vba_script(): xl=win32com.client.Dispatch("Excel.Application") xl.Workbooks.Open(Filename="filename",ReadOnly=1) xl.Application.ScreenUpdating = False xl.Application.Run("myscript") if __name__=='__main__': app = QtGui.QApplication(sys.argv) progress = Progress() progress.main() vb_thread = threading.Thread(target=run_vba_script) vb_thread.start() while vb_thread.is_alive(): file = open('newfile.txt', 'r') a = int(file.read()) progress.evolution(a) file.close() # only check once a second to not eat your file system and processor alive time.sleep(1) app.exec_()