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基础教程之Hello World!
Aug 29 Python
用python写的一个wordpress的采集程序
Feb 27 Python
Python排序搜索基本算法之插入排序实例分析
Dec 11 Python
Python语言的变量认识及操作方法
Feb 11 Python
Python爬虫包BeautifulSoup异常处理(二)
Jun 17 Python
pycharm在调试python时执行其他语句的方法
Nov 29 Python
在python中使用xlrd获取合并单元格的方法
Dec 26 Python
python实现Dijkstra静态寻路算法
Jan 17 Python
基于django channel实现websocket的聊天室的方法示例
Apr 11 Python
浅析PyTorch中nn.Linear的使用
Aug 18 Python
Python使用itchat模块实现群聊转发,自动回复功能示例
Aug 26 Python
python制作英语翻译小工具代码实例
Sep 09 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
基于HBase Thrift接口的一些使用问题及相关注意事项的详解
2013/06/03 PHP
深入PHP FTP类的详解
2013/06/13 PHP
php遍历目录与文件夹的多种方法详解
2013/11/14 PHP
php中获取主机名、协议及IP地址的方法
2014/11/18 PHP
php支付宝接口用法分析
2015/01/04 PHP
Thinkphp通过一个入口文件如何区分移动端和PC端
2017/04/18 PHP
Yii输入正确验证码却验证失败的解决方法
2017/06/06 PHP
php实现socket推送技术的示例
2017/12/20 PHP
如何在Laravel5.8中正确地应用Repository设计模式
2019/11/26 PHP
javascript实现 在光标处插入指定内容
2007/05/25 Javascript
Javascript 同时提交多个Web表单的方法
2009/02/19 Javascript
JavaScript 拾漏补遗
2009/12/27 Javascript
location.href 在IE6中不跳转的解决方法与推荐使用代码
2010/07/08 Javascript
jQuery ajax调用后台aspx后台文件的两种常见方法(不是ashx)
2016/06/28 Javascript
vue中echarts3.0自适应的方法
2018/02/26 Javascript
vue实现todolist基本功能以及数据存储功能实例详解
2019/04/11 Javascript
Vue基本使用之对象提供的属性功能
2019/04/30 Javascript
vue 组件中使用 transition 和 transition-group实现过渡动画
2019/07/09 Javascript
google广告之另类js调用实现代码
2020/08/22 Javascript
[02:41]DOTA2英雄基础教程 亚巴顿
2014/01/02 DOTA
Django框架序列化与反序列化操作详解
2019/11/01 Python
Tensorflow实现多GPU并行方式
2020/02/03 Python
python实现翻译word表格小程序
2020/02/27 Python
Python 打印自己设计的字体的实例讲解
2021/01/04 Python
Python使用tkinter制作在线翻译软件
2021/02/22 Python
非凡女性奢华谦虚风格:The Modist
2017/10/28 全球购物
Richards网上商店:当代时尚,遍布巴西
2019/11/03 全球购物
泰国第一在线超市:Tops
2021/02/13 全球购物
乔迁宴答谢词
2014/01/21 职场文书
《猫》教学反思
2014/02/26 职场文书
单位法人授权委托书范本
2014/10/09 职场文书
贫困证明书格式及范文
2014/10/15 职场文书
稽核岗位职责范本
2015/04/13 职场文书
《角的初步认识》教学反思
2016/02/17 职场文书
Nginx服务器如何设置url链接
2021/03/31 Servers
Python中生成随机数据安全性、多功能性、用途和速度方面进行比较
2022/04/14 Python