【PyQt5 学习记录】004:简单QThread笔记
在文本编辑框中每隔几秒添加一行文本,代码如下:
#!/usr/bin/python3
# -*- coding:utf-8 -*- import sys
from PyQt5.QtWidgets import (QApplication,
QWidget,
QLineEdit,
QPushButton,
QTextEdit,
QGridLayout)
from PyQt5.QtCore import (Qt,
QThread,
pyqtSignal,
pyqtSlot) class Window(QWidget):
def __init__(self, parent=None):
super(Window, self).__init__(parent, Qt.Widget) self.resize(460, 460)
self.setWindowTitle("Thread Test") self.lineEdit = QLineEdit(self)
self.lineEdit.setPlaceholderText("connect to...")
self.pushButton = QPushButton(">>", self)
self.pushButton.setFixedWidth(30)
self.stopButton = QPushButton("×", self)
self.stopButton.setFixedWidth(30)
self.textEdit = QTextEdit(self)
self.textEdit.setPlaceholderText("result...") grid = QGridLayout()
grid.addWidget(self.lineEdit, 0, 0, 1, 3)
grid.addWidget(self.pushButton, 0, 3)
grid.addWidget(self.stopButton, 0, 4)
grid.addWidget(self.textEdit, 1, 0, 5, 5)
self.setLayout(grid) self.show() class Run(Window):
sig = pyqtSignal(str) def __init__(self):
super().__init__() self.my_thread = None
self.pushButton.clicked.connect(self.button)
self.stopButton.clicked.connect(self.stop_button) def button(self):
self.textEdit.clear()
line_text = self.lineEdit.text()
# 创建线程
self.my_thread = MyThread()
# 将自定义信号sig连接到MyThread.on_source函数
self.sig.connect(self.my_thread.on_source)
# 向MyThread.on_source函数传递line_text
self.sig.emit(line_text)
# 直接调用MyThread.on_source()也可以,但还是建议使用信号传递,在灵活性和性能上更佳
# self.my_thread.on_source(line_text)
# 将自定义信号signal连接到information()槽函数
self.my_thread.signal.connect(self.information)
# 启动线程
self.my_thread.start()
self.pushButton.setEnabled(False) @pyqtSlot(str)
def information(self, info):
# 向textEdit添加lineEdit的文本
self.textEdit.append(info) def stop_button(self):
self.pushButton.setEnabled(True)
# 将MyThread.running设为False以停止线程
self.my_thread.running = False class MyThread(QThread):
# 自定义型号,执行run()函数时,从相关线程发射此信号
signal = pyqtSignal(str) def __init__(self):
super().__init__()
self.source_txt = None
self.running = True # 当发生QThread: Destroyed while thread is still running错误时,添加QThread.wait()
# def __del__(self):
# self.wait() def on_source(self, line_text):
self.source_txt = line_text @pyqtSlot()
def run(self):
while self.running:
# 发出信号
self.signal.emit(self.source_txt)
# 线程休眠1秒
self.sleep(1) if __name__ == "__main__":
app = QApplication(sys.argv)
win = Run()
sys.exit(app.exec_())
界面如图:
当线程开始运行时,每隔1秒传递一个self.source_txt。
点击pushButton时,使按钮不可用,并启动线程,在文本编辑框内不断插入lienEdit的内容。
点击stopButton时,停止线程。
【PyQt5 学习记录】004:简单QThread笔记的更多相关文章
- 【PyQt5 学习记录】001:第一个界面
PyQt5 的安装很简单: pip3 install PyQt5 然后就是写一个最简单的界面试试手: import sys from PyQt5.QtWidgets import QApplicati ...
- SQLServer存储过程和触发器学习记录及简单例子
一.存储过程 存储过程即为能完成特定功能的一组SQL语句集.如果需要对查出的多条数据进行操作的话,这里需要理解游标(CURSOR)的概念,对于oracle有for each row命令,可以不用游标 ...
- 【PyQt5 学习记录】006:重写窗口事件及QMessageBox
#!/usr/bin/env python import sys from PyQt5.QtWidgets import (QApplication, QMainWindow, QMessageBox ...
- 【PyQt5 学习记录】011:使用 QListWidet 创建列表
使用 QListWidet 创建列表 作者: 八月未见 博客: https://www.cnblogs.com/jmtm/ 创建列表: list_widget = QListWidget() 插入项目 ...
- 【PyQt5 学习记录】010:QSplitter
import sys from PyQt5.QtWidgets import (QApplication, QWidget, QSplitter, QTextEdit, QPushButton, QL ...
- 【PyQt5 学习记录】005:QMainWindow 及状态栏、菜单栏和工具栏
#!/usr/bin/env python import sys from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QA ...
- 【PyQt5 学习记录】003:水平布局和获取屏幕尺寸
#!/usr/bin/python3 # -*- coding:utf-8 -*- import sys from PySide2.QtWidgets import (QApplication, QW ...
- Spring学习记录2——简单了解Spring容器工作机制
简单的了解Spring容器内部工作机制 Spring的AbstractApplicationContext是ApplicationContext的抽象实现类,该抽象类的refresh()方法定义了Sp ...
- Metasploit学习记录---Nessus简单使用
1.更新插件 上次搭建完后总觉得不踏实,因为老是提示插件多久没更新了,然后果断花了1.25美刀买了台vps,终于把最新的插件下载下来了,总共190M,需要的QQ私信我.
随机推荐
- Asp.net的生命周期之应用程序生命周期
参考:http://msdn.microsoft.com/zh-cn/library/ms178473(v=vs.100).aspx 参考:http://www.cnblogs.com/JimmyZh ...
- Safari 不能播放Video ,Chrome等可以 问题解决。
1 原因分析 https://www.zhihu.com/question/41818719 2 代码实现 1 注意点: 请求时 : header中 range 请求多少长度 代码要返回相应的长度 ...
- Java多线程笔记[未更新完]
最近课上可摸鱼时间较多,因此并发开坑学习 本篇学习自Java多线程编程实战指南 目前进展:刚开坑,处于理解概念阶段 本篇学习自Java多线程编程实战指南 Q.进程和线程的区别 进程Process是程序 ...
- CentOS 7 安装RocketMQ遇到的问题汇总
1.运行broker时提示内存无法分配 解决办法:http://www.bubuko.com/infodetail-2088958.html
- Mac下Homebrew的图形化界面工具Cakebrew
安装: brew cask install cakebrew 如果不能下载直接上官网下载dmg包进行安装. 参考: https://www.cakebrew.com/ https://github.c ...
- 开源一个C# Class实现Openfire登陆、推出、消息发送,方便其他系统集成IM功能了
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 用python开发了一个简单apache web服务端范例,在win10 + apache2.4.9 + python3.5 测试成功
#!D:\Programs\Python\Python35-32\python.exe import cgi def htmlTop(): print("Content-type: ...
- VS2015编译Boost1.64
一.下载并解压:boost1.64.0:http://www.boost.org/users/history/version_1_64_0.html 二.以管理员权限运行VS2015命令行工具 三.c ...
- apktook 反编译错误
Exception in thread "main" brut.androlib.err.UndefinedResObject: resource spec: 0x01010490 ...
- python-thread封装类创建线程
#!/usr/bin/python #coding=utf-8 from time import ctime,sleep import threading class Mythead(threadin ...