问题描述
我正在开发一个项目,其中我有一个主类,它创建一个线程来执行一个很长的函数,而主类(我的 GUI)将继续可用于在执行这个长函数期间显示一些信息.所以我在 Stack Overflow 上找到了一种方法:
from PyQt5 import QtWidgets,QtCore,QtGui
from PyQt5.QtWidgets import QApplication
import threading
import sys
import time
from PyQt5.QtCore import QObject,pyqtSignal
class Ui_SaftMainWindow(object):
def setupUi(self,SaftMainWindow):
SaftMainWindow.setobjectName("SaftMainWindow")
SaftMainWindow.resize(178,284)
icon = QtGui.QIcon()
icon.addpixmap(QtGui.Qpixmap(":/logo/img_logo-E.png"),QtGui.QIcon.normal,QtGui.QIcon.Off)
SaftMainWindow.setwindowIcon(icon)
self.gridLayout = QtWidgets.qgridLayout(SaftMainWindow)
self.gridLayout.setobjectName("gridLayout")
self.frame_all_pb = QtWidgets.qframe(SaftMainWindow)
self.frame_all_pb.setMinimumSize(QtCore.QSize(160,0))
self.frame_all_pb.setMaximumSize(QtCore.QSize(160,16777215))
self.frame_all_pb.setobjectName("frame_all_pb")
self.gridLayout_7 = QtWidgets.qgridLayout(self.frame_all_pb)
self.gridLayout_7.setobjectName("gridLayout_7")
self.pb_stop_simu = QtWidgets.QPushButton(self.frame_all_pb)
self.pb_stop_simu.setText("STOP")
self.gridLayout_7.addWidget(self.pb_stop_simu,5,1,1)
self.pb_start_simu = QtWidgets.QPushButton(self.frame_all_pb)
self.pb_start_simu.setobjectName("pb_start_simu")
self.pb_start_simu.setText("START")
self.gridLayout_7.addWidget(self.pb_start_simu,4,1)
self.gridLayout.addWidget(self.frame_all_pb,1)
QtCore.QMetaObject.connectSlotsByName(SaftMainWindow)
class Solver(QObject,object):
data_changed = pyqtSignal(str,int)
def __init__(self):
# Call init function of QObject class for pyQt signal
QObject.__init__(self)
def init_parameters(self,input_files,**keys):
print("Some initialisation")
def time_step(self):
# Function with Fortran call
print("Fortran function")
def transient_solve(self,arg):
print("starting")
t = threading.currentThread()
i = 1
while getattr(t,"do_run",True):
print("working on " + str(i))
i += 1
time.sleep(5)
print("Stopping as you wish.")
class GuiHandler:
def __init__(self,gui,main_window,):
# Declarations
self.gui = gui
self.main_window = main_window
self.gui.setupUi(self.main_window)
self.gui.pb_start_simu.clicked.connect(self.pb_start_simu_clicked)
self.gui.pb_stop_simu.clicked.connect(self.pb_stop_simu_clicked)
# Create instance of the second class
app = Solver()
# Connect signal to emit signal from second class to ihm later
app.data_changed.connect(self.myfunction)
# Initialize some parameters of my second class
app.init_parameters("",json_file="",output_file="")
# Create thread object
self.t = threading.Thread(target=app.transient_solve,args=("task",))
def pb_start_simu_clicked(self):
print("Start thread")
self.t.start()
def pb_stop_simu_clicked(self):
print("Stop thread")
self.t.do_run = False
self.t.join()
def myfunction(self,string="this_is_a_test",integer=0):
print(str(string))
print(str(integer))
if __name__ == "__main__":
app = QApplication(sys.argv)
handler = GuiHandler(Ui_SaftMainWindow(),QtWidgets.QWidget())
handler.main_window.show()
sys.exit(app.exec_())
这个简单的例子有效。但是,当我通过调用更大的函数来替换睡眠时(调用编译为 Python 的 Fortran 文件的 time_step 函数,GUI 函数被阻止)
知道它是否与我创建和启动线程的方式有关,或者关于我必须检查/查找的内容才能使我的代码起作用吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)