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


Posted in Python onSeptember 15, 2020

心得:写着写着找到了自己的感觉,还是需要大量的代码和项目来加深对代码的理解

一、PyQt5多线程防卡死

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

# -*- coding: UTF-8 -*-
""""=================================================
@Project -> File  :Django 
@IDE  :PyCharm
@Author :爱跳水的温文尔雅的laughing
@Date  :2020/4/2 21:56
@Desc  :
=================================================="""

from PyQt5.QtCore import pyqtSignal, QThread
from PyQt5.QtWidgets import QWidget, QMainWindow, QApplication
from untitled import Ui_MainWindow
import sys
import time

class Example(QThread):
  signal = pyqtSignal(str) # 括号里填写信号传递的参数

  def __init__(self):
    super(Example, self).__init__()

  def __del__(self):
    self.wait()

  def run(self):
    """
    进行任务操作,主要的逻辑操作,返回结果
    """
    for i in range(10): 
      time.sleep(0.5)
      self.signal.emit(str("hello world"+str(i))) # 发射信号


class MyWindows(QMainWindow, Ui_MainWindow):
  def __init__(self):
    super(MyWindows, self).__init__()
    self.setupUi(self)
    self.pushButton.clicked.connect(self.buttonClick)

  # 点击事件启动线程
  def buttonClick(self):
    self.thread = Example()
    self.thread.signal.connect(self.callback) #连接回调函数,接收结果
    self.thread.start() # 启动线程

  def callback(self, msg):
    self.lineEdit.setText(str(msg))


if __name__ == '__main__':
  app = QApplication(sys.argv)
  mywindow = MyWindows()
  mywindow.show()
  sys.exit(app.exec_())

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

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

二、PyQt5多窗口用法

点击事件直接切换窗口

class MyWindows(QMainWindow, Ui_MainWindow):
  sig = pyqtSignal() #实例化信号

  def __init__(self):
    super(MyWindows, self).__init__()
    self.setupUi(self)
    self.pushButton.clicked.connect(self.slot_btn_function) #设定点击事件

  def slot_btn_function(self):
    # self.hide()
    self.f = Children() #第二个实例化UI
    self.f.show()

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

# -*- coding: UTF-8 -*-
""""=================================================
@Project -> File  :Django -> 二叉树之有序列表
@IDE  :PyCharm
@Author :爱跳水的温文尔雅的laughing
@Date  :2020/4/2 21:56
@Desc  :
=================================================="""
from PyQt5.QtCore import pyqtSignal, QThread
from PyQt5.QtWidgets import QWidget, QMainWindow, QApplication
from untitled import Ui_MainWindow
from children import Ui_Dialog
import sys

#第二个子窗口,当然子窗口也可以用多线程
class Children(QWidget, Ui_Dialog):
  def __init__(self):
    super(Children, self).__init__()
    self.setupUi(self)


#主窗口
class MyWindows(QMainWindow, Ui_MainWindow):
  sig = pyqtSignal() #实例化信号

  def __init__(self):
    super(MyWindows, self).__init__()
    self.setupUi(self)
    self.pushButton.clicked.connect(self.buttonClick) #设定点击事件
    self.sig.connect(self.signal_slot) #连接信号

  def buttonClick(self):
    self.sig.emit()

  #实例化第二个窗口
  def signal_slot(self):
    self.s = Children()
    self.s.show()


if __name__ == '__main__':
  app = QApplication(sys.argv)
  mywindow = MyWindows()
  mywindow.show()
  sys.exit(app.exec_())

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

三、Pyqt5常用指令

1、设置btn不能被点击

True可以正常点击

self.btn.setEnable(False)

2、菜单按钮绑定事件

按钮绑定事件

self.btn.clicked.connect(self.test)

菜单action绑定事件

self.btn.trigged.connect(self.test)

3、QLabel标签

label = QLabel(self)
label.setText("显示内容") # 写入
text = label.text() # 读取

4、QTextEdit文本编辑器

text_edit = QTextEdit(self)
text_edit.setText(a) # 设置文本
text_edit.append(a) # 追加文本
text = text_edit.toPlainText() # 获取文本

5、QPushButton按键

button = QPushButton(self)
button .setChecked() # 设置为可选中
button.clicked.connect(clicked_function) # 按下触发

def clicked_function():
	pass

6、QCheckBox复选框和QRadioButton单选按钮

radio_button1.setChecked(True) # 设置选中,同时只能有一个选中
check_box.setCheckable(True) # 设置为可被选中

到此这篇关于PyQt5多线程防卡死和多窗口用法的实现的文章就介绍到这了,更多相关PyQt5多线程防卡死和多窗口用法内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python中查看变量内存地址的方法
May 05 Python
python 时间戳与格式化时间的转化实现代码
Mar 23 Python
python下载图片实现方法(超简单)
Jul 21 Python
Android分包MultiDex策略详解
Oct 30 Python
python实现扫描日志关键字的示例
Apr 28 Python
浅谈python连续赋值可能引发的错误
Nov 10 Python
python 实现分页显示从es中获取的数据方法
Dec 26 Python
解决PyCharm控制台输出乱码的问题
Jan 16 Python
一文秒懂python读写csv xml json文件各种骚操作
Jul 04 Python
解决json中ensure_ascii=False的问题
Apr 03 Python
Jupyter安装链接aconda实现过程图解
Nov 02 Python
Python Selenium异常处理的实例分析
Feb 28 Python
PyQt5结合matplotlib绘图的实现示例
Sep 15 #Python
pycharm激活方法到2099年(激活流程)
Sep 22 #Python
pycharm专业版远程登录服务器的详细教程
Sep 15 #Python
深入浅析pycharm中 Make available to all projects的含义
Sep 15 #Python
pycharm-professional-2020.1下载与激活的教程
Sep 21 #Python
有关pycharm登录github时有的时候会报错connection reset的问题
Sep 15 #Python
Pycharm Git 设置方法
Sep 15 #Python
You might like
ThinkPHP开发框架函数详解:C方法
2015/08/14 PHP
WordPress特定文章对搜索引擎隐藏或只允许搜索引擎查看
2015/12/31 PHP
PHP flush 函数使用注意事项
2016/08/26 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
2020/04/04 PHP
理解Javascript_11_constructor实现原理
2010/10/18 Javascript
js Function类型
2011/12/04 Javascript
Javascript执行效率全面总结
2013/11/04 Javascript
javascript动态添加、修改、删除对象的属性与方法详解
2014/01/27 Javascript
JS实现网页滚动条感应鼠标变色的方法
2015/02/26 Javascript
浅谈jQuery中replace()方法
2015/05/13 Javascript
JavaScript事件 "事件对象"的注意要点
2016/01/14 Javascript
javascript基础语法——全面理解变量和标识符
2016/06/02 Javascript
JavaScript中 ES6 generator数据类型详解
2016/08/11 Javascript
使用vue实现grid-layout功能实例代码
2018/01/05 Javascript
微信小程序实现换肤功能
2018/03/14 Javascript
基于vue2.0动态组件及render详解
2018/03/17 Javascript
angular2实现统一的http请求头方法
2018/08/13 Javascript
js实现通过开始结束控制的计时器
2019/02/25 Javascript
详解关于React-Router4.0跳转不置顶解决方案
2019/05/10 Javascript
Angular value与ngValue区别详解
2019/11/27 Javascript
Vue之封装公用变量以及实现方式
2020/07/31 Javascript
微信小程序基于ColorUI构建皮皮虾短视频去水印组件
2020/11/04 Javascript
JavaScript代码实现简单计算器
2020/12/27 Javascript
[00:55]深扒TI7聊天轮盘语音出处3
2017/05/11 DOTA
Python和perl实现批量对目录下电子书文件重命名的代码分享
2014/11/21 Python
Python基于二分查找实现求整数平方根的方法
2016/05/12 Python
python爬虫入门教程--利用requests构建知乎API(三)
2017/05/25 Python
对python周期性定时器的示例详解
2019/02/19 Python
python多进程并行代码实例
2019/09/30 Python
django haystack实现全文检索的示例代码
2020/06/24 Python
利用Python过滤相似文本的简单方法示例
2021/02/03 Python
简述你对Statement,PreparedStatement,CallableStatement的理解
2013/03/25 面试题
护士个人简历自荐信
2013/10/18 职场文书
python实战之90行代码写个猜数字游戏
2021/04/22 Python
一劳永逸彻底解决pip install慢的办法
2021/05/24 Python
TaiShan 200服务器安装Ubuntu 18.04的图文教程
2022/06/28 Servers