小计"/>
PYQT5子线程与主线程之间通讯问题小计
子线程与主线程通讯
1、问题描述
主要是想实现主界面中写sql代码,然后运行,由于代码可能运行时间过长,为了不影响主界面使用所以想将耗时较长的跑sql阶段交给子线程。
2、子线程代码
class run_oracle(QThread):_signal=pyqtSignal(object) ###定义一个信号变量def __init__(self):super(run_oracle, self).__init__()def accept(self,l:list): ###用于接受主界面传过来的代码self.code=l[0]self.con=l[1]def run(self): ####重写QThread类中的run方法data = pd.read_sql(self.code, self.con) ###利用pandas提取数据self._signal.emit([data,1]) ###将带有数据的信号发送,这里我返回的数据是一个列表格式,具体可以根据实际修改
这里有几个问题注意一下:
1、这个run方法是不能带参数,所以主界面发送过来的代码不能直接用run方法接收,这里定义了一个accept方法来接收主界面传过来的代码。
2、不要把执行sql代码的语句写在accept里面,如果写在里面的话,主界面依旧会卡到代码执行完成后才能用
3、由于整体代码较长这里只放主界面关于子线程处理的方法
def thredrun(self):self.thr=run_oracle()try:self.thr.accept([self.code,self.con]) ###调用子线程参数接受方法self.thr.start() ###启动子线程self.thr._signal.connect(self.onclick) ####将子线程信号带过来的数据发送给onclick槽函数进行业务处理except:#print(code)QMessageBox(QMessageBox.Critical, '错误提示', '获取数据异常,请检查代码or数据库连接').exec_()
关于主线程和子线程互相通信的整个流程就是这样,说一下自己的体会吧:
这块内容我在网上搜索了两个晚上,得到的方法我都自己试了下不知道啥原因都没有成功,其中我觉得最应该成功的方法就是,在主界面也定义一个信号向子线程的槽函数发送数据,这个感觉没问题啊,但是就是没成功也是醉了,最后自己一点点试也算是试出来这样一种方式,那种离成功一步之遥却总是出问题的感觉真的难受!
更多推荐
PYQT5子线程与主线程之间通讯问题小计
发布评论