我正在开发一个具有主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)
...