介绍
本篇文章给大家分享的是有关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,逻辑运行在子线程,前端显示在主线程
点击事件直接切换窗口
类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_ ())
1,设置btn不能被点击
真的可以正常点击
self.btn.setEnable (False)
2,菜单按钮绑定事件
按钮绑定事件