PYQT中QThread输出到textBrowser
问题概述
在PYQT中,有时我们会需要将log信息等实时打印到ui控件上,但是由于PYQT的进程保护机制,我们无法像使用print函数中那样,直接使用就能打印出来信息。所以通常都会发现,PYQT中的UI控件,比如QTextBrowser,使用它的append()函数和print函数同时来打印信息,往往print会将信息实时一点点打印出来,而QTextBrowser则不会,反而会等到这一段程序运行结束后,一次性把所有信息打印出来。
前面的描述有点绕,再简述一下:PYQT中在控件(比如QTextBrowser)上无法像print函数那样实时打印信息,而是会在程序段结束后,一次性全部打印上去。
在网上查找资料后,看到了解决方案:http://bbs.csdn.net/topics/390478497
注:那个帖子有点老了,有些程序也许运行不通,我只是根据里面给的自己修改的。
解决思路
- 使用QThread创建一个新线程,在线程中定义一个信号trigger,使用emit函数向trigger中“灌水”;
- 定义槽函数update_text,将其与信号trigger连接,并接收emit函数送过来的信息(可以是字符串,也可以是int或是double),在槽函数中使用append函数打印出来。
完整程序
import sys
from PyQt4 import QtGui,QtCore
import time
import randomclass MyThread(QtCore.QThread):trigger = QtCore.pyqtSignal(str)def __init__(self, parent=None):super(MyThread, self).__init__(parent)def run_(self, message):#time.sleep(random.random() * 5)self.trigger.emit(message)class Main(QtGui.QMainWindow):def __init__(self, parent=None):super(Main, self).__init__(parent)self.text_area = QtGui.QTextBrowser()self.thread_button = QtGui.QPushButton('Start threads')self.thread_button.clicked.connect(self.start_threads)central_widget = QtGui.QWidget()central_layout = QtGui.QHBoxLayout()central_layout.addWidget(self.text_area)central_layout.addWidget(self.thread_button)central_widget.setLayout(central_layout)self.setCentralWidget(central_widget)self.threads = MyThread(self)self.threads.trigger.connect(self.update_text)self.thread_no = 0def start_threads(self):self.thread_no += 1message = "cnt:{0}".format(self.thread_no)self.threads.run_(message) # start the threadprint(message)def update_text(self, message):# self.text_area.append('thread # %d finished'%thread_no)# print('thread # %d finished'%thread_no)self.text_area.append(message)if __name__ == '__main__':app = QtGui.QApplication(sys.argv)mainWindow = Main()mainWindow.show()sys.exit(app.exec_())
简要说明
前面给出了完整程序,这里捡几个要点说明一下:
trigger = QtCore.pyqtSignal(str)
创建一个信号trigger,传输字符串类型的数据。
def run_(self, message):self.trigger.emit(message)
在线程类中另外定义的一个函数,主要就是调用trigger的emit函数(向trigger这个通道的入口灌水)。
self.threads = MyThread(self)
self.threads.trigger.connect(self.update_text)
创建线程类的实例,并将信号trigger连接到槽函数update_text。
def update_text(self, message):# self.text_area.append('thread # %d finished'%thread_no)# print('thread # %d finished'%thread_no)self.text_area.append(message)
定义槽函数update_text,在控件上打印信息(前面定义了信号传输的是str,所以这里直接打印)。
运行结果
后记
自己正好碰到了这个问题,所以就记录一下,以便以后查阅。
吐槽:最近总碰到人在博客上问我为什么程序跑不通之类的问题,我也不知道你的环境是什么样的,少了什么依赖项,请自行解决,我只能尽力保证在自己的电脑上运行通过,能力有限请见谅。
PYQT中QThread输出到textBrowser相关推荐
- 在PyQt中构建 Python 菜单栏、菜单和工具栏
摘要:菜单.工具栏和状态栏是大多数GUI 应用程序的常见且重要的图形组件.您可以使用它们为您的用户提供一种快速访问应用程序选项和功能的方法. 本文分享自华为云社区<Python 和 PyQt:创 ...
- 剖析PHP中的输出缓冲
剖析PHP中的输出缓冲 本文按署名·非商业用途·保持一致授权 作者: ,发表于2005年12月24日01时54分 我们先来看一段代码. <?php for ($i=10; $i>0; $ ...
- PHP中刷新输出缓冲
http://www.cnblogs.com/mutuan/archive/2012/03/18/2404957.html PHP中刷新输出缓冲 buffer是一个内存地址空间,Linux系统默认大小 ...
- python能够处理的最大整数是多少_python中能输出的最大整数位是多少
考虑下面的Python程序. # A Python program to demonstrate that we can store # large numbers in Python x = 100 ...
- php 像页面输出html,PHP在页面中原样输出HTML代码的方法介绍
本篇文章给大家介绍一下PHP在页面中原样输出HTML代码的方法.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. 字符串与HTML之间的相互转换主要应用htmlentities()函数 ...
- PyCharm中控制台输出日志分层级分颜色显示
原文:https://blog.csdn.net/linzi1994/article/details/83009233 PyCharm中控制台输出日志分层级分颜色显示 版权声明:本文为博主原创文章,未 ...
- Qt/PyQt中使用系统全局的快捷键
Qt/PyQt中使用系统全局的快捷键 除了全局快捷键部分外,其他的都比较简单,都是我实现"onekeycodehighlighter"中碰到的一些小问题,这里顺面整理一下.事实上, ...
- linux+输出分页,是否可以在zsh中自动分页输出?
有时我们在终端运行一个命令,输出太大,我们忘了把"| less"放到最后.所以我想知道当zsh中的输出太大时可以分页输出吗? 我尝试使用python和less实现此功能: #!/u ...
- VC如何在编译链接程序过程中在输出窗口看到链接的顺序
VC如何在编译链接程序过程中在输出窗口看到链接的顺序 具体操作:选择VC菜单Project->Settings->Link页,然后在Project Options的Edit栏中输入/ver ...
最新文章
- 只会python好找工作吗-python真的不好找工作吗?
- laravel 邮件SwiftMailer
- Python编程基础:第二十四节 作用域Scope
- TEEC_Context和TEEC_InitializeContext介绍
- C++用stack实现深度优先搜索DFS(附完整源码)
- Shell入门(二)之变量
- java接口类支持多继承
- 2018年的AI/ML惊喜及预测19年的走势(一)
- php 规则配置,模块Config配置规则
- 四层和七层负载均衡的区别介绍(转载)
- 基于Session的认证方式_实现会话功能_Spring Security OAuth2.0认证授权---springcloud工作笔记117
- 数据结构与算法(一):线性表、栈、树(二叉树,AVL树)、图
- unix环境高级编程(第三版)-读书笔记1
- 社交网络叠加直播功能,会产生什么化学反应?
- java 复制excel_PoiUtil.java 用于excel间sheet复制
- 实战:战狼2票房数据分析——(2)票房数据构造及保存
- AE效果:模糊和锐化
- android switch 空间,android Android UI(Switch)详解
- 使用vnc软件将kindle作为显示屏。
- 上海市行政管理学校96计算机,上海市行政管理学校