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为tornado添加recaptcha验证码功能
Feb 26 Python
Python实现简单的文件传输与MySQL备份的脚本分享
Jan 03 Python
Python探索之Metaclass初步了解
Oct 28 Python
Python将多个excel表格合并为一个表格
Feb 22 Python
浅析python实现scrapy定时执行爬虫
Mar 04 Python
一个简单的python爬虫程序 爬取豆瓣热度Top100以内的电影信息
Apr 17 Python
对Python中数组的几种使用方法总结
Jun 28 Python
Selenium控制浏览器常见操作示例
Aug 13 Python
Django中更改默认数据库为mysql的方法示例
Dec 05 Python
完美解决Python matplotlib绘图时汉字显示不正常的问题
Jan 29 Python
python 定义类时,实现内部方法的互相调用
Dec 25 Python
python pyg2plot的原理知识点总结
Feb 28 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后端方法)
2016/02/03 PHP
PHP 读取大文件并显示的简单实例(推荐)
2016/08/12 PHP
PHP后端银联支付及退款实例代码
2017/06/23 PHP
使用jquery获取网页中图片高度的两种方法
2013/09/26 Javascript
JS小功能(列表页面隔行变色)简单实现
2013/11/28 Javascript
node.js报错:Cannot find module 'ejs'的解决办法
2016/12/14 Javascript
JS实现的验证身份证及获取地区功能示例
2017/01/16 Javascript
jquery表单验证实例仿Toast提示效果
2017/03/03 Javascript
Vue监听数据对象变化源码
2017/03/09 Javascript
浅谈vue项目如何打包扔向服务器
2018/05/08 Javascript
深入理解JavaScript 中的执行上下文和执行栈
2018/10/23 Javascript
VUE接入腾讯验证码功能(滑块验证)备忘
2019/05/07 Javascript
js实现小星星游戏
2020/03/23 Javascript
javascript中layim之查找好友查找群组
2021/02/06 Javascript
[46:16]2018DOTA2亚洲邀请赛3月30日 小组赛B组 iG VS VP
2018/03/31 DOTA
matplotlib设置legend图例代码示例
2017/12/19 Python
python2.7到3.x迁移指南
2018/02/01 Python
tensorflow实现对图片的读取的示例代码
2018/02/12 Python
python 筛选数据集中列中value长度大于20的数据集方法
2018/06/14 Python
浅谈pytorch和Numpy的区别以及相互转换方法
2018/07/26 Python
Django之无名分组和有名分组的实现
2019/04/16 Python
PyTorch中常用的激活函数的方法示例
2019/08/20 Python
浅谈django channels 路由误导
2020/05/28 Python
Python Http请求json解析库用法解析
2020/11/28 Python
用CSS3打造HTML5的Logo(实现代码)
2016/06/16 HTML / CSS
Fossil美国官网:化石手表、手袋、首饰及配饰
2019/02/17 全球购物
北美最大的手工艺品零售商之一:Michaels Stores
2019/02/27 全球购物
经典c++面试题二
2015/08/14 面试题
大学教师年终总结的自我评价
2013/10/29 职场文书
设计师求职信模板
2014/05/06 职场文书
党支部反对四风思想汇报
2014/10/10 职场文书
2015年公务员个人工作总结
2015/04/24 职场文书
《月球之谜》教学反思
2016/02/20 职场文书
tensorflow学习笔记之tfrecord文件的生成与读取
2021/03/31 Python
HTML+JS实现在线朗读器
2022/02/15 Javascript
python 使用pandas读取csv文件的方法
2022/12/24 Python