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多线程编程(三):threading.Thread类的重要函数和方法
Apr 05 Python
Python中django学习心得
Dec 06 Python
python中的迭代和可迭代对象代码示例
Dec 27 Python
人生苦短我用python python如何快速入门?
Mar 12 Python
pandas 对每一列数据进行标准化的方法
Jun 09 Python
python打包exe开机自动启动的实例(windows)
Jun 28 Python
浅析PyTorch中nn.Module的使用
Aug 18 Python
python多线程同步之文件读写控制
Feb 25 Python
python yield关键词案例测试
Oct 15 Python
python实现控制台输出颜色
Mar 02 Python
pytorch 如何使用batch训练lstm网络
May 28 Python
python 镜像环境搭建总结
Sep 23 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处理SQL脚本文件导入到MySQL的代码实例
2014/03/17 PHP
PHP连接Nginx服务器并解析Nginx日志的方法
2015/08/16 PHP
给moz-firefox下添加IE方法和属性
2007/04/10 Javascript
javascript 新浪背投广告实现代码
2009/07/07 Javascript
JavaScript格式化数字的函数代码
2010/11/30 Javascript
一起来写段JS drag拖动代码
2010/12/09 Javascript
全面解析Bootstrap表单使用方法(表单样式)
2015/11/24 Javascript
prototype框架中美元符号$用法分析
2016/01/22 Javascript
深入理解JS实现快速排序和去重
2016/10/17 Javascript
Angular4学习笔记之实现绑定和分包
2017/08/01 Javascript
JS库之Three.js 简易入门教程(详解之一)
2017/09/13 Javascript
vue跨域解决方法
2017/10/15 Javascript
angular实现页面打印局部功能的思考与方法
2018/04/13 Javascript
vue工程全局设置ajax的等待动效的方法
2019/02/22 Javascript
如何利用javascript接收json信息并进行处理
2020/08/06 Javascript
python开发之thread线程基础实例入门
2015/11/11 Python
Python抓取电影天堂电影信息的代码
2016/04/07 Python
OpenCV实现人脸识别
2017/04/07 Python
python抓取文件夹的所有文件
2018/02/27 Python
python判断一个集合是否为另一个集合的子集方法
2018/05/04 Python
python ipset管理 增删白名单的方法
2019/01/14 Python
windows下Python安装、使用教程和Notepad++的使用教程
2019/10/06 Python
Python简单实现区域生长方式
2020/01/16 Python
python如何修改文件时间属性
2021/02/05 Python
大学毕业生的自我鉴定
2013/11/30 职场文书
出国留学介绍信
2014/01/13 职场文书
学生干部学习的自我评价
2014/02/18 职场文书
园艺师求职信
2014/03/10 职场文书
战友聚会主持词
2014/04/02 职场文书
金融保险专业求职信
2014/09/03 职场文书
公司员工辞职信范文
2015/05/12 职场文书
基层党建工作简报
2015/07/21 职场文书
社区挂职锻炼个人工作总结
2015/10/23 职场文书
导游词之大雁塔景区
2019/09/17 职场文书
MySQL令人咋舌的隐式转换
2021/04/05 MySQL
IDEA 2022 Translation 未知错误 翻译文档失败
2022/04/24 Java/Android