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使用wxPython打开并播放wav文件的方法
Apr 24 Python
python并发编程之多进程、多线程、异步和协程详解
Oct 28 Python
virtualenv实现多个版本Python共存
Aug 21 Python
python使用os.listdir和os.walk获得文件的路径的方法
Dec 16 Python
全面了解Nginx, WSGI, Flask之间的关系
Jan 09 Python
解决sublime+python3无法输出中文的问题
Dec 12 Python
pandas 对group进行聚合的例子
Dec 27 Python
python实现将json多行数据传入到mysql中使用
Dec 31 Python
PyTorch里面的torch.nn.Parameter()详解
Jan 03 Python
pandas DataFrame 数据选取,修改,切片的实现
Apr 24 Python
Python读取Excel一列并计算所有对象出现次数的方法
Sep 04 Python
python飞机大战游戏实例讲解
Dec 04 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
一篇入门的php Class 文章
2007/04/04 PHP
浅析十款PHP开发框架的对比
2013/07/05 PHP
php中单个数据库字段多列显示(单字段分页、横向输出)
2014/07/28 PHP
CI框架源码解读之URI.php中_fetch_uri_string()函数用法分析
2016/05/18 PHP
mac下多个php版本快速切换的方法
2016/10/09 PHP
Laravel框架查询构造器 CURD操作示例
2019/09/04 PHP
JS将表单导出成EXCEL的实例代码
2013/11/11 Javascript
用IE重起计算机或者关机的示例代码
2014/03/10 Javascript
node.js 中国天气预报 简单实现
2016/06/06 Javascript
使用JS中的exec()方法构造正则表达式验证
2016/08/01 Javascript
PHP抓取HTTPS内容和错误处理的方法
2016/09/30 Javascript
微信小程序 地图(map)实例详解
2016/11/16 Javascript
JavaScript中Math对象的方法介绍
2017/01/05 Javascript
Bootstrap实现渐变顶部固定自适应导航栏
2020/08/27 Javascript
vue中使用element-ui进行表单验证的实例代码
2018/06/22 Javascript
jquery ajax加载数据前台渲染方式 不用for遍历的方法
2018/08/09 jQuery
nodejs 使用 js 模块的方法实例详解
2018/12/04 NodeJs
JS重学系列之聊聊new操作符
2019/03/04 Javascript
WebGL学习教程之Three.js学习笔记(第一篇)
2019/04/25 Javascript
nodejs中实现用户注册路由功能
2019/05/20 NodeJs
如何让微信小程序页面之间的通信不再变困难
2019/06/03 Javascript
详解ES6 中的Object.assign()的用法实例代码
2021/01/11 Javascript
jupyter安装小结
2016/03/13 Python
python 对象和json互相转换方法
2018/03/22 Python
详解numpy的argmax的具体使用
2019/05/27 Python
python tkinter基本属性详解
2019/09/16 Python
简单了解python数组的基本操作
2019/11/26 Python
windows下python安装pip方法详解
2020/02/10 Python
有趣的Python图片制作之如何用QQ好友头像拼接出里昂
2020/04/22 Python
End Clothing美国站:英国男士潮牌商城
2018/04/20 全球购物
组织关系转移介绍信
2014/01/16 职场文书
文化与传播毕业生求职信
2014/03/09 职场文书
对标管理实施方案
2014/03/12 职场文书
六年级小学生评语
2014/12/26 职场文书
铁人观后感
2015/06/16 职场文书
python3中apply函数和lambda函数的使用详解
2022/02/28 Python