在PyQt5中通过命令行调用外部程序时,是否有方法阻止GUI冻结?

2024-09-29 19:33:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在尝试为一个项目创建GUI。我有一个“exe”文件,我需要在应用程序的后台运行,只需按下一个按钮。我使用qprocess创建了一个基于线程的函数来调用exe文件,它可以正常工作。但问题是,它冻结了GUI,并且在尝试多个文件时总是显示没有响应

是否有任何方法可以重新路由Qprocess,使其不会以某种方式阻止GUI,使我仍然可以访问Qprocess exe文件输出

编辑#1:exe文件的进程与用户提供的“配体文件”数量成比例。对于测试,我必须提供至少100个左右的文件。这会导致GUI上出现足够多的冻结,以至于任务栏上会显示not responsive

class Main(QtWidgets.QMainWindow, Ui_MainWindow):
    def testMain(self):
        ligands = glob.glob("*.sdf")
        liglen = len(ligands)
        self.files_2.setText("<b>1/{} Ligand(s)</b>".format(liglen))
        x = self.progressBar.setMaximum(liglen)
        t = threading.Thread(target = self.ligconv(ligands))
        t.start()
    def ligconv (self, ligands):
        process = QProcess()
        cd = "babel.exe"
        for i in ligands:
            tem = re.sub('\..*', '.pdbqt', i)
            ligename = tem
            ar = [receptorname, "-xnrcp", "-O", ligname]
            process.execute(cd, ar)

后期脚本

  • 我知道,只要我按下按钮,通过cmd路由的exe文件就会得到控制
  • 我还知道,使用QProcessWaitFor命令会阻塞GUI,因此我已经从代码中删除了它们
  • 很抱歉,我不能真正显示我正在使用的代码,因为它是一个重要的项目,这是相同的最小代码:)

Tags: 文件项目代码self路由defguiprocess
1条回答
网友
1楼 · 发布于 2024-09-29 19:33:39

您正在主线程中执行t = threading.Thread(target = self.ligconv(ligands)),因为您的代码等效于:

res = self.ligconv(ligands)
t = threading.Thread(target = res)

相反,目标必须接收可调用的,如果要传递额外的参数,则应使用args:

t = threading.Thread(target=self.ligconv, args=(ligands,))

相关问题 更多 >

    热门问题