线程函数-PyQt GUI

时间:2017-09-05 14:38:09

标签: multithreading python-3.x subprocess pyqt5 qt-designer

我遇到一个问题,试图让按钮点击调用函数时我的程序不会冻结。该函数使用subprocess.Popen打开一个.bat文件,但是当.bat正在运行时,它会冻结我的整个GUI,我希望用户能够仍然使用GUI。我对线程很新。我确实理解线程是一个解决方案,但我不确定如何在点击按钮时创建一个调用此函数的线程。请记住,我的功能是在QtDesigner创建的窗口内。我能解决这个问题的任何想法或方法吗?也许带我到某个可以找到答案的地方?

主要班级名称:

类Ui_TestClass(对象):

我的功能:

  def runprogram(self):
    dir = self.cwdList[-1]
    test = os.listdir(dir)
    for item in test:
        if item.endswith('.OUT'):
            os.remove(join(dir, item))
    new, ok = QInputDialog.getText(None, "Case Name","Type in a case name to run. (No Spaces) \nOn file dialog, choose file to rename.")
    if (ok):
        newcase = new
    changename =  str(QtWidgets.QFileDialog.getOpenFileName(None, 'Choose file', '{0}'.format(self.cwdList[-1]), 'Text files (*.ZCSP*)')[0])
    shutil.move(changename, '{0}\{1}.ZCSP'.format(self.cwdList[-1], newcase))
    self.replaceText('{0}.ZCSP'.format(newcase))
    with open('Test.bat', "w") as runname:
        run = 'ZCSP {0}.ZCSP {0}.OUT'.format(newcase, newcase)
        runname.write(run)
    process = subprocess.Popen([r"{0}\Test.bat".format(self.cwdList[-1])])
    process.wait()

self.cwdList只是一个目录列表

t = threading.Thread(target=self.runprogram)
t.start()

我读过这可能有用,但我如何在我的QtDesigner创建的代码中插入它?

2 个答案:

答案 0 :(得分:1)

我认为我解决了这个问题。只需拥有它,当你按下按钮它运行一个函数,产生一个线程来运行你的程序。例如:

def buttonFunction(self):
    t = threading.Thread(target=self.runprogram)
    t.start()

则...

def runprogram(self):
    process = subprocess.Popen([r"{0}\Test.bat".format(self.cwdList[-1])])
    process.wait()

程序在后台运行,GUI的功能仍然存在。

答案 1 :(得分:0)

我通过简单地删除process.wait()解决了这个问题。我仍然有兴趣找到一个关于如何使用QtDesigner创建代码的线程的解决方案。