使用PyQt进行线程处理

时间:2016-12-21 17:13:29

标签: python multithreading pyqt

我正在开发一个具有主GUI的程序。用户从这里输入他们的信息并点击“开始”。当发生这种情况时,GUI从另一个文件调用一个函数,这需要几个小时才能运行。我遇到的问题是当这个函数运行时,GUI将变为空白并且没有响应(应该如此)。我正在尝试找到最好的编写方式,以便GUI保持响应并可以运行其他东西。另外,如果可能的话,我希望主GUI显示包装函数的进度。

我找不到这样做的方法,以便主GUI知道函数何时完成运行。这很重要,因为“运行”按钮已关闭,因此不会意外地多次运行,但需要在一切完成后重新打开。另外,我读过的所有解决方案都涉及到将functions.py文件转换为巨型类。如果有一个好处,那么我很好这样做,但我没有看到任何大的优势,因此意图保持是作为功能。

关于MainWindow在此函数运行时正在做什么:它需要输入并打开另一个ResultsWindow。

以下是我的文件结构:

  • ui_MainWindow.py - 来自Qt Designer

  • Main.py - 运行ui_MainWindow并调用所有函数

  • functions.py - 包含许多函数以及两个“包装函数”。这些包装函数需要一段时间才能运行,但这里还有其他函数可以自己调用。

  • Results.py - 这是另一个我可以随时调用的编码(不是在Qt Designer中制作)的GUI。

这就是Main.py的样子:

import functions
import ui_Main.py

class MainWindow(...):
    def __init__(self, parent=None):
        self.btn.clicked.connect(self.run)
        self.btn2.clicked.connect(self.OpenResults)
    def run(self):
        finished_status = functions.wrapper1(arguments)
        self.statusbar.showMessage(finished_status)
    def OpenResults(self):
        if self.resultsWindow != None:
            self.resultsWindow.close()
        self.resultsWindow = LiveData.main(arguments)
        self.resultsWindow.show()

这是functions.py的样子:

def func1(args):
    do some stuff
def func2(args):
    do some stuff
def func3(args):
    do some stuff
def wrapper(many args):
    for i in range(0,arg1):
        func1(args)
        func2(args)
        ...
def wrapper(many args):
    for i in range(0, arg1):
        func1(args)
        func3(args)
        ...

0 个答案:

没有答案