使用PyQt4写界面后台程序方法总结
使用PyQt4编写界面后台程序的方法总结
一、怎么建立多线程
界面程序如果有稍微耗时一点的任务如果不使用多线程就会界面卡死,所以大多数情况会使用到多线程。PyQt4自己有多线程的机制,可以派生多线程类然后生成多线程实例。代码如下:
form PyQt4.QtCore import * class MyThread(QThread):
def __init__(self,func,args):
super(MyThread,self).__init__()
self.func = func
self.args = args def run(self):
self.func(self,args)
在创建线程时,只要向MyThread实例传参,参数内容为实际要调用的耗时函数及其参数就可以了,如下:
class Ui():
self.thread1 = MyThread(func,args)
self.thread1.start() #此处开始自动调用线程的run函数
PS:在一个程序中只有一个主线程,在界面程序中该主线程就是界面所在的线程,其他产生的线程都是子线程;子线程创建后执行任务,当任务执行完后会自动消亡,所以可以对每个耗时的任务分别设置一个新的线程是没有问题的
二、如何在界面中打印日志
此处我分为了两种情况,第一种是需要使用线程的耗时任务的日志,第二种是不需要使用线程的任务的日志。
1、使用线程调用任务函数
这种情况下,在线程类中创建信号并将其作为参数传给任务函数,在主界面类中connect,代码如下:
form PyQt4.QtCore import * class MyThread(QThread):
sendlog = pyqtSignal(str)
def __init__(self,func,args,s):
super(MyThread,self).__init__()
self.func = func
self.args = args
self.s = s
def run(self):
self.sendlog.connect(self.s)
self.func(self,args,self.sendlog)
在被线程调用的func中接收signal,然后有log要显示时用signal.emit(log),其中需将log变为unicode字符否则界面显示中文会有乱码
其中self.s为主界面向控件输入日志的控件,即接收信号的函数,在线程中做connect可以避免在主线程中每次创建一个新线程都需要connect一次
2、不使用线程
在任务类中建立与上面相同的信号,在主界面中进行connect。此处有一个问题需注意,如果创建信号的类不是派生类就会报错,我是让类随便继承了一个类QFile后问题就没有了
三、关于信号的定义及引用
信号需要定义在类的初始化函数外,且为类属性,不能是实例属性,即定义时信号名前面没有self
引用signal时必须用类的实例,因为用实例引用时pyqt就会自动把信号同实例绑定即产生一个绑定的信号,绑定的信号才有connect()、emit()等方法,类直接引用信号尝试connect时,会有编译错误: AttributeError:"PyQt4.QtCore.pyqtSignal" object has no attribute "connect"
使用PyQt4写界面后台程序方法总结的更多相关文章
- 更改开机默认不显示explorer.exe,直接启动自己写的EXE程序方法
原文:更改开机默认不显示explorer.exe,直接启动自己写的EXE程序方法 更改开机默认不显示explorer.exe,直接启动自己写的EXE程序的函数: bool UpdateWinlogon ...
- Android -- 开机启动无界面后台程序
简单的说,这是一个没有界面的后台运行的应用程序 而且,还有一功能:开机自启动,启动运行一个服务 程序结构非常简单,两个类,一个是service的扩展类,一个是BroadcastReceiver扩展类 ...
- 用JQuery中的Ajax方法获取web service等后台程序中的方法
用JQuery中的Ajax方法获取web service等后台程序中的方法 1.准备需要被前台html页面调用的web Service,这里我们就用ws来代替了,代码如下: using System; ...
- ios后台程序持续运行方法
iOS系统的资源是有限的,应用程序在前台和在后台的状态是不一样的.在后台时,程序会受到系统的很多限制,这样可以提高电池的使用和用户体验.但是有很多社交类的软件,如果因为它在后台就不能刷新到新的数据的话 ...
- [转载]C#控制台应用程序里调用自己写的函数的方法
(2011-08-15 15:52:13) 转载▼ 标签: 转载 分类: 技术类 原文地址:C#控制台应用程序里调用自己写的函数的方法作者:萧儿 最近写程序,遇到了一个很白痴的问题,记录下来,免得下次 ...
- Macbook怎么强制关闭后台程序?Macbook强制关闭后台程序的方法
有时候我们的Macbook电脑运行某个程序卡在那里耗了很长时间,程序本身有可能提供了取消按钮,点了也没有反应,这时候我们就很想强制关闭它了,那么Macbook怎么强制关闭后台运行的程序呢?下面完美小编 ...
- 后台程序在向tty/串口写数据的时候stop了
当后台程序向tty/串口写数据的时候stop了. STOPPED(SIGTTOU) .... SIGTTOU:代表的是后台程序向 controlling terminal写数据. 解决办法:暂时在程序 ...
- 第15.17节 PyQt(Python+Qt)入门学习:PyQt图形界面应用程序的事件捕获方法大全及对比分析
老猿Python博文目录 老猿Python博客地址 按照老猿规划的章节安排,信号和槽之后应该介绍事件,但事件在前面的随笔<PyQt(Python+Qt)实现的GUI图形界面应用程序的事件捕获方法 ...
- linux 下恢复后台程序的方法
一直以为这个东西不怎么重要,所以一直没怎么去记,已经第三次百度了,不想再有第四次. 如果你在终端下运行一个程序,如果这个程序正在运行,我们可以用 ctrl + z 的命令将这个程序挂到后台. desk ...
随机推荐
- NMAP扫描UDP123NTP端口详解
我用的nmap版本:Zenmap 6.25 例如命令: nmap -sU -pU:123 -Pn -n --script=ntp-monlist IP 如果要批量进行,可以把IP存放在ip.txt可以 ...
- Laravel 依赖注入原理
众所周知 Laravel 的文档对于依赖注入只写了如何使用,相信大多数人对于他的实现原理并不太清楚.虽然使用过程中并不需要关心她的原理,但是了解原理让你使用起来更自信.这个帖子就通过一个小 demo ...
- 使用SQLiteDatabase进行数据库操作的步骤
1.获取SQLiteDatabase对象,它代表了与数据库的连接.2.调用SQLiteDatabase的方法来执行SQL语句.3.操作SQL语句的执行结果,比如用SimpleCursorAdapter ...
- 寻找第K小元素
要在一个序列里找出第K小元素,可以用排序算法,然后再找.可以证明,排序算法的上界为O(nlogn). 在这里,给出两种可以在线性时间内找出第K小元素的方法. 方法1: (1) 选定一个比较小的阈值(如 ...
- 大型分布式C++框架《四:netio之buffer管理器 下》
每周一篇又来了.这次主要介绍netio的buffer管理器. 首先buffer管理是每一个网络层不可回避的问题.怎么高效的使用buffer是很关键的问题.这里主要介绍下我们的netio是怎么处理.说实 ...
- final(最终、修饰符)
/* final(最终.修饰符) final关键字的用法: 1. final关键字修饰一个基本类型的变量时,该变量不能重新赋值,第一次的值为最终的. 2. fianl关键字修饰一个引用类型变量时,该变 ...
- 获得HttpServletResponse及其他对象
下面只列出获得 HttpServletResponse 对象的方法,获得 HttpServletRequest 对象方法类似. 在struts1.x Action类的execute方法中,有四个参数, ...
- djano-cms学习笔计(一)
开放源码的内容管理系统,基于Web框架Django的. 优势如下 高度可扩展的插件系统,可让您自由地构建各种内容的网站. 前端编辑直接更改您的网站上的内容.工程的所有插件. 感谢可读的网址的页面结构是 ...
- [ES6] Class Inherit
In constructor, you can call parent's constuctor() method by supert(); class ShoppingCart { construc ...
- c++Socket 异步通讯
在网络通讯中,由于网络拥挤或一次发送的数据量过大等原因,经常会发生交换的数据在短时间内不能传送完,收发数据的函数因此不能返回,这种现象叫做阻塞. Winsock对有可能阻塞的函数提供了两种处理方式:阻 ...