PyQt5实现多线程防卡死和多窗口用法的方法

  介绍

本篇文章给大家分享的是有关PyQt5实现多线程防卡死和多窗口用法的方法,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

<强>一、PyQt5多线程防卡死

在界面中,通常用会有一些按钮,点击后触发事件,比如去下载一个文件或者做一些操作,这些操作会耗时,如果不能及时结束,主线程将会阻塞,这样界面就会出现未响应的状态,因此必须使用多线程来解决这个问题。

 # - * -编码:utf - 8 - *
  ““““=================================================@Project→Django文件:
  @IDE: PyCharm
  @Author:爱跳水的温文尔雅的笑
  @Date: 2020/4/2 21:56
  @Desc:==================================================啊啊?
  
  从PyQt5。QtCore进口pyqtSignal QThread
  从PyQt5。QtWidgets进口QWidget QMainWindow QApplication
  从untitled进口Ui_MainWindow
  导入系统
  导入的时间
  
  类的例子(QThread):
  信号=pyqtSignal (str) #括号里填写信号传递的参数
  
  def __init__(自我):
  超级(自我). __init__ ()
  
  def __del__(自我):
  self.wait ()
  
  def运行(自我):
  “““
  进行任务操作,主要的逻辑操作,返回结果
  “““
  因为我在范围(10):
  time . sleep (0.5)
  self.signal.emit (str(“你好world" + str (i))) #发射信号
  
  
  类MyWindows (QMainWindow Ui_MainWindow):
  def __init__(自我):
  超级(MyWindows自我). __init__ ()
  self.setupUi(自我)
  self.pushButton.clicked.connect (self.buttonClick)
  
  #点击事件启动线程
  def buttonClick(自我):
  自我。线程=例子()
  self.thread.signal.connect (self.callback) #连接回调函数,接收结果
  self.thread.start() #启动线程
  
  def回调(自我,味精):
  self.lineEdit.setText (str(味精)
  
  
  if __name__==& # 39; __main__ # 39;:
  应用=QApplication (sys.argv)
  mywindow=MyWindows ()
  mywindow.show ()
  sys.exit (app.exec_ ()) 

点击之后显示会从1到9,逻辑运行在子线程,前端显示在主线程

 PyQt5实现多线程防卡死和多窗口用法的方法

点击事件直接切换窗口

类MyWindows (QMainWindow Ui_MainWindow):
  sig=pyqtSignal() #实例化信号
  
  def __init__(自我):
  超级(MyWindows自我). __init__ ()
  self.setupUi(自我)
  self.pushButton.clicked.connect (self.slot_btn_function) #设定点击事件
  
  def slot_btn_function(自我):
  # self.hide ()
  自我。f=孩子()#第二个实例化UI
  self.f.show () 

自定义信号和槽函数来打开第二个窗口

 # - * -编码:utf - 8 - *
  ““““=================================================@Project→文件:Django→二叉树之有序列表
  @IDE: PyCharm
  @Author:爱跳水的温文尔雅的笑
  @Date: 2020/4/2 21:56
  @Desc:==================================================啊啊?
  从PyQt5。QtCore进口pyqtSignal QThread
  从PyQt5。QtWidgets进口QWidget QMainWindow QApplication
  从untitled进口Ui_MainWindow
  从儿童进口Ui_Dialog
  导入系统
  
  #第二个子窗口,当然子窗口也可以用多线程
  类的孩子(QWidget Ui_Dialog):
  def __init__(自我):
  超级(孩子,自我). __init__ ()
  self.setupUi(自我)
  
  
  #主窗口
  类MyWindows (QMainWindow Ui_MainWindow):
  sig=pyqtSignal() #实例化信号
  
  def __init__(自我):
  超级(MyWindows自我). __init__ ()
  self.setupUi(自我)
  self.pushButton.clicked.connect (self.buttonClick) #设定点击事件
  self.sig.connect (self.signal_slot) #连接信号
  
  def buttonClick(自我):
  self.sig.emit ()
  
  #实例化第二个窗口
  def signal_slot(自我):
  自我。s=孩子()
  self.s.show ()
  
  
  if __name__==& # 39; __main__ # 39;:
  应用=QApplication (sys.argv)
  mywindow=MyWindows ()
  mywindow.show ()
  sys.exit (app.exec_ ()) 

 PyQt5实现多线程防卡死和多窗口用法的方法

1,设置btn不能被点击

真的可以正常点击

self.btn.setEnable (False)

2,菜单按钮绑定事件

按钮绑定事件

PyQt5实现多线程防卡死和多窗口用法的方法