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深入学习之特殊方法与多范式
Aug 31 Python
跟老齐学Python之模块的加载
Oct 24 Python
python中星号变量的几种特殊用法
Sep 07 Python
Python 字符串大小写转换的简单实例
Jan 21 Python
Python实现购物系统(示例讲解)
Sep 13 Python
详解分布式任务队列Celery使用说明
Nov 29 Python
python中count函数简单用法
Jan 05 Python
如何使用selenium和requests组合实现登录页面
Feb 03 Python
Python编程快速上手——选择性拷贝操作案例分析
Feb 28 Python
Python 使用 PyQt5 开发的关机小工具分享
Jul 16 Python
利用Selenium添加cookie实现自动登录的示例代码(fofa)
May 08 Python
Python制作动态字符画的源码
Aug 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
Zerg建筑一览
2020/03/14 星际争霸
php面向对象全攻略 (四)构造方法与析构方法
2009/09/30 PHP
Yii实现多数据库主从读写分离的方法
2014/12/29 PHP
Yii中实现处理前后台登录的新方法
2015/12/28 PHP
PHP实现数组向任意位置插入,删除,替换数据操作示例
2019/04/05 PHP
PHP数组与字符串互相转换实例
2020/05/05 PHP
goto语法在PHP中的使用教程
2020/09/17 PHP
动态加载js文件 document.createElement
2006/10/14 Javascript
JQuery 选择器 xpath 语法应用
2010/05/13 Javascript
从零开始学习jQuery (三) 管理jQuery包装集
2011/02/23 Javascript
jQuery 1.7.2中getAll方法的疑惑分析
2012/05/23 Javascript
终于解决了IE8不支持数组的indexOf方法
2013/04/03 Javascript
node.js Web应用框架Express入门指南
2014/05/28 Javascript
SublimeText自带格式化代码功能之reindent
2015/12/27 Javascript
javascript每日必学之封装
2016/02/23 Javascript
JSON与JS对象的区别与对比
2017/03/01 Javascript
解决React Native端口号修改的方法
2017/07/28 Javascript
用node开发并发布一个cli工具的方法步骤
2019/01/03 Javascript
vue实现多组关键词对应高亮显示功能
2019/07/25 Javascript
使用js原生实现年份轮播选择效果实例
2021/01/12 Javascript
详解Django框架中用户的登录和退出的实现
2015/07/23 Python
python中安装模块包版本冲突问题的解决
2017/05/02 Python
Python标准库inspect的具体使用方法
2017/12/06 Python
TensorFlow入门使用 tf.train.Saver()保存模型
2018/04/24 Python
Python+pandas计算数据相关系数的实例
2018/07/03 Python
对于Python深浅拷贝的理解
2019/07/29 Python
python读文件的步骤
2019/10/08 Python
Python TCP通信客户端服务端代码实例
2019/11/21 Python
一款css实现的鼠标经过按钮的特效
2014/09/11 HTML / CSS
澳大利亚排名第一的狂热牛仔品牌:ONETEASPOON
2018/11/20 全球购物
Groupon比利时官方网站:特卖和网上购物高达-70%
2019/08/09 全球购物
中学实习教师自我鉴定
2013/12/12 职场文书
读书心得体会
2013/12/28 职场文书
2014年自我评价
2014/01/04 职场文书
2014年建筑工作总结
2014/11/26 职场文书
利用python Pandas实现批量拆分Excel与合并Excel
2021/05/23 Python