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使用心得之获得github代码库列表
Jun 25 Python
Python中字符串的修改及传参详解
Nov 30 Python
使用python实现tcp自动重连
Jul 02 Python
Python3利用SMTP协议发送E-mail电子邮件的方法
Sep 30 Python
python之pandas用法大全
Mar 13 Python
python基于http下载视频或音频
Jun 20 Python
python中字符串内置函数的用法总结
Sep 13 Python
django一对多模型以及如何在前端实现详解
Jul 24 Python
Django中的静态文件管理过程解析
Aug 01 Python
基于python监控程序是否关闭
Jan 14 Python
Python内置函数及功能简介汇总
Oct 13 Python
教你如何使用Python下载B站视频的详细教程
Apr 29 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实现telnet功能示例
2014/04/08 PHP
图片上传即时显示缩略图的js代码
2009/05/27 Javascript
jquery.boxy插件的iframe扩展代码
2010/07/02 Javascript
手写的一个兼容各种浏览器的javascript getStyle函数(获取元素的样式)
2014/06/06 Javascript
jQuery过滤选择器用法分析
2015/02/10 Javascript
AngularJS手动表单验证
2016/02/01 Javascript
通过正则表达式获取url中参数的简单实现
2016/06/07 Javascript
jQuery实现点击后高亮背景固定显示的菜单效果【附demo源码下载】
2016/09/21 Javascript
jquery移除了live()、die(),新版事件绑定on()、off()的方法
2016/10/26 Javascript
微信小程序 天气预报开发实例代码源码
2017/01/20 Javascript
jQuery排序插件tableSorter使用方法
2017/02/10 Javascript
angularjs实现下拉列表的选中事件示例
2017/03/03 Javascript
微信小程序三级联动地址选择器的实例代码
2017/07/12 Javascript
swiper.js插件实现pc端文本上下滑动功能示例
2018/12/03 Javascript
解决vue 表格table列求和的问题
2019/11/06 Javascript
Vue如何跨组件传递Slot的实现
2020/12/14 Vue.js
[49:15]DOTA2-DPC中国联赛 正赛 CDEC vs XG BO3 第二场 1月19日
2021/03/11 DOTA
python每隔N秒运行指定函数的方法
2015/03/16 Python
Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】
2017/09/28 Python
pytorch: tensor类型的构建与相互转换实例
2018/07/26 Python
Python遍历字典方式就实例详解
2019/12/28 Python
Python Tkinter Entry和Text的添加与使用详解
2020/03/04 Python
Python Opencv 通过轨迹(跟踪)栏实现更改整张图像的背景颜色
2020/03/09 Python
pandas创建DataFrame的7种方法小结
2020/06/14 Python
Python使用pickle进行序列化和反序列化的示例代码
2020/09/22 Python
html5 视频播放解决方案
2016/11/06 HTML / CSS
英国电信商店:BT Shop
2019/12/17 全球购物
2013年办公室秘书的个人自我鉴定
2013/10/24 职场文书
优秀班干部事迹材料
2014/01/26 职场文书
教师党员承诺书
2014/03/25 职场文书
廉洁使者实施方案
2014/03/29 职场文书
捐款倡议书
2014/04/14 职场文书
《郑和远航》教学反思
2014/04/16 职场文书
2015年学校禁毒工作总结
2015/05/27 职场文书
Python中Selenium对Cookie的操作方法
2021/07/09 Python
Python 一键获取电脑浏览器的账号密码
2022/05/11 Python