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 爬取微信文章
Jan 30 Python
Python实现读取邮箱中的邮件功能示例【含文本及附件】
Aug 05 Python
python学习教程之使用py2exe打包
Sep 24 Python
Python基础语言学习笔记总结(精华)
Nov 14 Python
python使用xlrd和xlwt读写Excel文件的实例代码
Sep 05 Python
详解Python 正则表达式模块
Nov 05 Python
Python小工具之消耗系统指定大小内存的方法
Dec 03 Python
基于Python实现签到脚本过程解析
Oct 25 Python
python系统指定文件的查找只输出目录下所有文件及文件夹
Jan 19 Python
tensorflow保持每次训练结果一致的简单实现
Feb 17 Python
Pycharm如何运行.py文件的方法步骤
Mar 03 Python
pandas的resample重采样的使用
Apr 24 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 服务器调试 Zend Debugger 的安装教程
2009/09/25 PHP
关于PHP的相似度计算函数:levenshtein的使用介绍
2013/04/15 PHP
PHP+MYSQL实现用户的增删改查
2015/03/24 PHP
Laravel 5框架学习之子视图和表单复用
2015/04/09 PHP
php实现word转html的方法
2016/01/22 PHP
Symfony2实现从数据库获取数据的方法小结
2016/03/18 PHP
php的常量和变量实例详解
2017/06/27 PHP
laravel 解决多库下的DB::transaction()事务失效问题
2019/10/21 PHP
jQuery源码分析-05异步队列 Deferred 使用介绍
2011/11/14 Javascript
JavaScript实现复制功能各浏览器支持情况实测
2013/07/18 Javascript
jquery 获取 outerHtml 包含当前节点本身的代码
2014/10/30 Javascript
Node.js编程中客户端Session的使用详解
2015/06/23 Javascript
JS+CSS实现表格高亮的方法
2015/08/05 Javascript
javascript实现获取浏览器版本、浏览器类型
2015/12/02 Javascript
jQuery中的通配符选择器使用总结
2016/05/30 Javascript
ES6新特性四:变量的解构赋值实例
2017/04/21 Javascript
angular学习之从零搭建一个angular4.0项目
2017/07/10 Javascript
Vue.js组件间的循环引用方法示例
2017/12/27 Javascript
[49:30]DOTA2-DPC中国联赛正赛 Dragon vs Dynasty BO3 第二场 3月4日
2021/03/11 DOTA
跟老齐学Python之Import 模块
2014/10/13 Python
python: line=f.readlines()消除line中\n的方法
2018/03/19 Python
分分钟入门python语言
2018/03/20 Python
利用Python将数值型特征进行离散化操作的方法
2018/11/06 Python
Python cv2 图像自适应灰度直方图均衡化处理方法
2018/12/07 Python
pytorch之ImageFolder使用详解
2020/01/06 Python
浅谈python之自动化运维(Paramiko)
2020/01/31 Python
解决pyCharm中 module 调用失败的问题
2020/02/12 Python
ffmpeg+Python实现B站MP4格式音频与视频的合并示例代码
2020/10/21 Python
open_basedir restriction in effect. 原因与解决方法
2021/03/14 PHP
BannerBuzz加拿大:在线定制横幅印刷、广告和标志
2020/03/10 全球购物
运动会通讯稿500字
2014/02/20 职场文书
信仰纪录片观后感
2015/06/08 职场文书
2016关于读书活动的心得体会
2016/01/14 职场文书
评测 | 大屏显示带收音机的高端音箱,JBL TUNE2便携式插卡音箱实测
2021/04/24 无线电
Python中22个万用公式的小结
2021/07/21 Python
MySQL数据库实验之 触发器和存储过程
2022/06/21 MySQL