PySide2多线程问题示例:创建新线程、子线程发射信号到主界面
本文是在pyside学习过程中的记录,从无子线程、子线程在主程序中直接操作Qt界面、子线程发射信号操作主界面三个步骤出发,记录对多线程的一种处理方式。作为一名小白,若有描述不合理之处还请大神指出。
以下主要包含两部分:
1、问题展示
2、代码展示

一、示例问题(随便整了一个简单的):创建一个小程序,在一个界面输入最大最小值,在另一个界面依次打印出以下信息:从最小值开始,每次加1,到最大值后结束。
先给出三个方式的结果:
1、只有一个主程序:在操作界面填入信息,点击开始按钮后,无法再点击界面上其他任何东西,多次点击后程序卡住,直到打印完毕后才反应过来
2、添加新线程,但是新线程直接操作主界面,程序执行时,再操作主界面,直接崩溃。。。。。。

3、还是让子线程发射信号给一个函数,然后间接操作主界面吧,终于好了!!!能够在打印数字的同时对界面进行其他操作!

二、上述三种方式的代码,都传了一遍,好做对比,ui文件是用Qt设计师做的,因为界面很简单就不上传了
1、只有一个主程序

from PySide2.QtWidgets import QApplication,QWidget,QPlainTextEdit,QProgressBar
from PySide2.QtUiTools import QUiLoader
from PySide2.QtCore import QFile
from time import sleepclass Start1(QWidget):def __init__(self):#-----动态加载ui文件-------#qtmp = QFile("duoxiancheng.ui")# 导入Qt designer生成的界面ui文件qtmp.open(QFile.ReadOnly)qtmp.close()self.ui = QUiLoader().load(qtmp)self.ui.pushButton.clicked.connect(self.printFunc)  # 将pushButton按钮链接到打印函数#-------定义打印函数-----------#def printFunc(self):#-----读取输入的最大最小值--------#num_min = int(self.ui.lineEdit_min.text())num_max = int(self.ui.lineEdit_max.text())num = num_max - num_min + 1#---------打印函数的执行主体------------#for i in range(num):self.ui.plainTextEdit.appendPlainText(str(num_min))     # 输出到文本框self.ui.progressBar.setValue(int((i + 1) / num * 100))   # 给进度条赋值num_min += 1sleep(0.1)            # 休眠0.1秒,模拟实际运行时程序的耗时if __name__ == '__main__':app = QApplication([])stats1 = Start1()stats1.ui.show()app.exec_()

2、增加新线程,利用thread类,创建新的线程

from PySide2.QtWidgets import QApplication,QWidget,QPlainTextEdit,QProgressBar
from PySide2.QtUiTools import QUiLoader
from PySide2.QtCore import QFile
from threading import Thread  # 导入thread
from time import sleepclass Start1(QWidget):def __init__(self):#-----动态加载ui文件-------#qtmp = QFile("duoxiancheng.ui")qtmp.open(QFile.ReadOnly)qtmp.close()self.ui = QUiLoader().load(qtmp)self.ui.pushButton.clicked.connect(self.new_printFunc)  # 将pushButton按钮链接到新线程函数#-------定义打印函数-----------#def printFunc(self):#-----读取输入的最大最小值--------#num_min = int(self.ui.lineEdit_min.text())num_max = int(self.ui.lineEdit_max.text())num = num_max - num_min + 1#---------打印函数的执行主体------------#for i in range(num):self.ui.plainTextEdit.appendPlainText(str(num_min))     # 输出到文本框self.ui.progressBar.setValue(int((i + 1) / num * 100))   # 给进度条赋值num_min += 1sleep(0.1)            # 休眠0.1秒,模拟实际运行时程序的耗时#-------创建新线程函数------#def new_printFunc(self):thread = Thread(target=self.printFunc)  #此处省略了参数args=('参数1', '参数2'),仅指定了新线程入口函数(即我们定义好的打印函数)thread.start() # 开启新线程if __name__ == '__main__':app = QApplication([])stats1 = Start1()stats1.ui.show()app.exec_()

3、通过信号函数操作主界面,这一步主要思想是将子线程中的值(在本例中是文本框中的数字和进度条的值)通过一个信号发送到主程序中,由主程序操作主界面。

from PySide2.QtWidgets import QApplication,QWidget,QPlainTextEdit,QProgressBar
from PySide2.QtUiTools import QUiLoader
from PySide2.QtCore import QFile
from threading import Thread
from PySide2.QtCore import Signal,QObject  # 导入信号类
from time import sleepclass MySignals(QObject):# 定义一种信号,因为有文本框和进度条两个类,此处要四个参数,类型分别是: QPlainTextEdit 、 QProgressBar、字符串和整形数字# 调用 emit方法发信号时,传入参数必须是这里指定的参数类型# 此处也可分开写两个函数,一个是文本框输出的,一个是给进度条赋值的text_print = Signal(QPlainTextEdit,QProgressBar,str,int)class Start1(QWidget):def __init__(self):#-----动态加载ui文件-------#qtmp = QFile("duoxiancheng.ui")qtmp.open(QFile.ReadOnly)qtmp.close()self.ui = QUiLoader().load(qtmp)self.ui.pushButton.clicked.connect(self.new_printFunc)self.ms = MySignals()                              #引入信号函数self.ms.text_print.connect(self.pF)           #将信号传递给主程序中pF函数进行处理def new_printFunc(self): # 新线程入口函数thread = Thread(target=self.printFunc)thread.start()def printFunc(self):    #打印函数num_min=int(self.ui.lineEdit_min.text())num_max=int(self.ui.lineEdit_max.text())num=num_max-num_min+1for i in range(num):#此处不再直接操作主界面,而是发射信号给MySignals函数中的text_print,#传递参数包括要操作哪个位置和要操作的内容self.ms.text_print.emit(self.ui.plainTextEdit,self.ui.progressBar,str(num_min),int((i+1)/num*100))  num_min+=1sleep(0.1)#接收到发来的信号,pt和pb就是要操作的位置self.ui.plainTextEdit和self.ui.progressBar,text和int1则是具体内容def pF(self,pt,pb,text,int1):pt.appendPlainText(text)pb.setValue(int1)if __name__ == '__main__':app = QApplication([])stats1 = Start1()stats1.ui.show()app.exec_()

参考资料:
感谢白月黑羽老师的教程能让我白嫖~
http://www.python3.vip/tut/py/extra/multi_thread/

PySide2多线程问题示例:创建新线程、子线程发射信号到主界面相关推荐

  1. Java多线程01:创建新的执行线程

    ⭕️前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家(点击跳转到网站)⭕️ 创建新的执行线程(thread.Runnable) 核心概念 线程就是独立的执行路径 在程序 ...

  2. Java多线程之----主线程会等待子线程结束再结束么,怎么让主线程等待子线程结束呐?

    首先给出结论: 主线程和子线程之间没有谁先谁后结束这种关联,它们只是各自负责自己的线程任务,如果该线程的任务结束了,该线程自然会结束运行. talk is cheap,show me the code ...

  3. 【Java并发性和多线程】如何创建并运行java线程

    2019独角兽企业重金招聘Python工程师标准>>> 本文为转载学习 原文链接:http://tutorials.jenkov.com/java-concurrency/creat ...

  4. [Java][Android] 多线程同步-主线程等待全部子线程完毕案例

    有时候我们会遇到这种问题:做一个大的事情能够被分解为做一系列相似的小的事情,而小的事情无非就是參数上有可能不同样而已! 此时,假设不使用线程,我们势必会浪费许多的时间来完毕整个大的事情.而使用线程的话 ...

  5. main线程 子线程 顺序_在主线程main中开启子线程thread示例

    主线程中开启子线程代码实例: 创建CancleThread类 继承 Thread,对run()方法进行重写代码实例: class CancleThread extends Thread { priva ...

  6. 多线程经典问题1——主线程子线程交替问题

    提出问题: * 子线程循环 10 次,接着主线程循环 100 次,接着又回到子线程循环 10 次,接着再回到主线程又循环 100 次.如此循环50次. 分析:这个实际上是非常easy的问题.即子线程r ...

  7. main线程 子线程 顺序_面试官:线程池如何按照core、max、queue的执行顺序去执行?详解...

    前言 这是一个真实的面试题. 前几天一个朋友在群里分享了他刚刚面试候选者时问的问题:"线程池如何按照core.max.queue的执行循序去执行?". 我们都知道线程池中代码执行顺 ...

  8. java父线程子线程

    问:在父线程中New了一个子线程,想在停止父线程时也停止子线程,应该怎么做? 答: 从某种程度上讲,做不到.    不管是父线程还是子线程,这只不过是在运行时谁建了谁时用的,一旦所谓的字线程被启动,这 ...

  9. java 事务管理 子父线程_java父线程子线程(转)

    问:在父线程中New了一个子线程,想在停止父线程时也停止子线程,应该怎么做? 答: 从某种程度上讲,做不到. 不管是父线程还是子线程,这只不过是在运行时谁建了谁时用的,一旦所谓的字线程被启动,这两个线 ...

最新文章

  1. No resource found that matches the given name '@style/Theme.AppCompat.Light'
  2. 谷歌最新论文:手机端的实时3-D目标检测
  3. python下载保存_下载并保存图片Python2.7
  4. 五分钟学会使用 go modules(含在家办公使用技巧)
  5. quot;《 Serial Drivers 》by Alessandro Rubiniquot; 学习笔记
  6. PHP版_游戏扫码登录器程序源码
  7. Android View的绘制流程简述 Android自定义View(一)
  8. 【jQuery笔记Part4】03-事件详解
  9. 【DCVRP】基于matlab蚁群算法求解带容量+距离的车辆路径规划问题【含Matlab源码 1038期】
  10. 第 10 章 Python 第三方库使用
  11. 常见的Ajax写法汇总
  12. Android Studio实现计算器功能
  13. fms服务器ip修改,FusionSphere 平台修改管理网段和VLAN
  14. springboot使用logback
  15. 案例分享 | CEVA 使用 TensorFlow Lite 在边缘设备部署语音识别引擎及前端
  16. Web测试的常见测试点
  17. 阿里新零售中的智能补货(I)— 库存模型
  18. composer的原理和正确使用(最新)
  19. XERO到底强在哪里?
  20. 强联通分量与双连通分量

热门文章

  1. 微信公众号文章存在敏感词被屏蔽
  2. 程序员风格的修真小说之炫小说
  3. 【社区分享】专注移动端机器学习交流,TensorFlow Lite 中文兴趣小组招募中!
  4. 常见HTTP/FTP/WebSockets状态码大全
  5. 服务器上文件共享有哪些协议,Windows中的文件共享协议
  6. Linux 网络编程socket错误分析
  7. 【每日蓝桥】5、一三年省赛Java组真题“有理数类”
  8. [经验栈]C#监测IPv4v6网速及流量
  9. 解决cannot find -lopencv_dep_cudart问题
  10. Window10 WiFi列表不显示解决方案