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的Flask框架下使用sqlalchemy库的简单教程
Apr 09 Python
Python中统计函数运行耗时的方法
May 05 Python
详解Django之admin组件的使用和源码剖析
May 04 Python
Python实现曲线拟合操作示例【基于numpy,scipy,matplotlib库】
Jul 12 Python
python Tkinter版学生管理系统
Feb 20 Python
python 用 xlwings 库 生成图表的操作方法
Dec 22 Python
python 字符串的驻留机制及优缺点
Jun 19 Python
Python如何操作docker redis过程解析
Aug 10 Python
Python基于unittest实现测试用例执行
Nov 25 Python
python3 通过 pybind11 使用Eigen加速代码的步骤详解
Dec 07 Python
matplotlib部件之矩形选区(RectangleSelector)的实现
Feb 01 Python
Python 阶乘详解
Oct 05 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
PHP5中使用DOM控制XML实现代码
2010/05/07 PHP
用PHP写的一个冒泡排序法的函数简单实例
2016/05/26 PHP
php禁用函数设置及查看方法详解
2016/07/25 PHP
PHP编程获取图片的主色调的方法【基于Imagick扩展】
2017/08/02 PHP
Thinkphp开发--集成极光推送
2017/09/15 PHP
PHP实现关键字搜索后描红功能示例
2019/07/03 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
JavaScript 应用类库代码
2008/06/02 Javascript
JavaScript可否多线程? 深入理解JavaScript定时机制
2012/05/23 Javascript
javascript date格式化示例
2013/09/25 Javascript
利用jQuery实现可输入搜索文字的下拉框
2013/10/23 Javascript
JavaScript实现MIPS乘法模拟的方法
2015/04/17 Javascript
Bootstrap每天必学之表单
2015/11/23 Javascript
JavaScript之iterable_动力节点Java学院整理
2017/06/29 Javascript
Angular中使用MathJax遇到的一些问题
2017/12/15 Javascript
小程序获取周围IBeacon设备的方法
2018/10/31 Javascript
layui下拉框获取下拉值(select)的例子
2019/09/10 Javascript
Vue路由的模块自动化与统一加载实现
2020/06/05 Javascript
[01:16:12]完美世界DOTA2联赛PWL S2 FTD vs Inki 第一场 11.21
2020/11/23 DOTA
Python获取远程文件大小的函数代码分享
2014/05/13 Python
Python实现生成简单的Makefile文件代码示例
2015/03/10 Python
python开发之tkinter实现图形随鼠标移动的方法
2015/11/11 Python
Python实现压缩和解压缩ZIP文件的方法分析
2017/09/28 Python
python文件处理fileinput使用方法详解
2020/01/02 Python
python中的 zip函数详解及用法举例
2020/02/16 Python
python中time.ctime()实例用法
2021/02/03 Python
纯CSS3代码实现文字描边
2016/04/25 HTML / CSS
浅谈css3中的前缀
2016/07/20 HTML / CSS
Carrs Silver官网:英国著名的银器品牌
2020/08/29 全球购物
副总经理工作职责
2013/11/28 职场文书
高一物理教学反思
2014/01/24 职场文书
常务副县长“四风”个人对照检查材料思想汇报
2014/10/02 职场文书
营业员岗位职责范本
2015/04/14 职场文书
财务统计员岗位职责
2015/04/14 职场文书
舞蹈社团活动总结
2015/05/07 职场文书
小学体育课教学反思
2016/02/16 职场文书