使用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写界面后台程序方法总结的更多相关文章

  1. 更改开机默认不显示explorer.exe,直接启动自己写的EXE程序方法

    原文:更改开机默认不显示explorer.exe,直接启动自己写的EXE程序方法 更改开机默认不显示explorer.exe,直接启动自己写的EXE程序的函数: bool UpdateWinlogon ...

  2. Android -- 开机启动无界面后台程序

    简单的说,这是一个没有界面的后台运行的应用程序 而且,还有一功能:开机自启动,启动运行一个服务 程序结构非常简单,两个类,一个是service的扩展类,一个是BroadcastReceiver扩展类 ...

  3. 用JQuery中的Ajax方法获取web service等后台程序中的方法

    用JQuery中的Ajax方法获取web service等后台程序中的方法 1.准备需要被前台html页面调用的web Service,这里我们就用ws来代替了,代码如下: using System; ...

  4. ios后台程序持续运行方法

    iOS系统的资源是有限的,应用程序在前台和在后台的状态是不一样的.在后台时,程序会受到系统的很多限制,这样可以提高电池的使用和用户体验.但是有很多社交类的软件,如果因为它在后台就不能刷新到新的数据的话 ...

  5. [转载]C#控制台应用程序里调用自己写的函数的方法

    (2011-08-15 15:52:13) 转载▼ 标签: 转载 分类: 技术类 原文地址:C#控制台应用程序里调用自己写的函数的方法作者:萧儿 最近写程序,遇到了一个很白痴的问题,记录下来,免得下次 ...

  6. Macbook怎么强制关闭后台程序?Macbook强制关闭后台程序的方法

    有时候我们的Macbook电脑运行某个程序卡在那里耗了很长时间,程序本身有可能提供了取消按钮,点了也没有反应,这时候我们就很想强制关闭它了,那么Macbook怎么强制关闭后台运行的程序呢?下面完美小编 ...

  7. 后台程序在向tty/串口写数据的时候stop了

    当后台程序向tty/串口写数据的时候stop了. STOPPED(SIGTTOU) .... SIGTTOU:代表的是后台程序向 controlling terminal写数据. 解决办法:暂时在程序 ...

  8. 第15.17节 PyQt(Python+Qt)入门学习:PyQt图形界面应用程序的事件捕获方法大全及对比分析

    老猿Python博文目录 老猿Python博客地址 按照老猿规划的章节安排,信号和槽之后应该介绍事件,但事件在前面的随笔<PyQt(Python+Qt)实现的GUI图形界面应用程序的事件捕获方法 ...

  9. linux 下恢复后台程序的方法

    一直以为这个东西不怎么重要,所以一直没怎么去记,已经第三次百度了,不想再有第四次. 如果你在终端下运行一个程序,如果这个程序正在运行,我们可以用 ctrl + z 的命令将这个程序挂到后台. desk ...

随机推荐

  1. js 数组引用 发现的问题

    最近做项目时,要对返回的数据[保存在json数组中]做一次修改,但原数据要保留一次做备用.首先想到,原数据不动,用一个临时的变量来修改,大致模型就是这样: // 原始: a=[1,2,3,4,5,.. ...

  2. Java---设计模块(单例的变形)(多例)

    设计模式1--单例变形(多例) ★ 缓存在单例中的使用 缓存在编程中使用很频繁,有着非常重要的作用,它能够帮助程序实现以空间换取时间,通常被设计成整个应用程序所共享的一个空间,现要求实现一个用缓存存放 ...

  3. Linux之V4L2视频采集编程详解

     V4L2(Video For Linux Two) 是内核提供给应用程序访问音.视频驱动的统一接口. Linux系统中,视频设备被当作一个设备文件来看待,设备文件存放在 /dev目录下,完整路径的设 ...

  4. HDU 3264 Open-air shopping malls (计算几何-圆相交面积)

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=3264 题意:给你n个圆,坐标和半径,然后要在这n个圆的圆心画一个大圆,大圆与这n个圆相交的面积必须大于等 ...

  5. tomcat+redis实现session共享缓存

    一:linux下redis安装 1.wget http://download.redis.io/releases/redis-3.2.4.tar.gz 2.tar xzf redis-3.2.4.ta ...

  6. 基于MFC的socket编程(异步非阻塞通信)

       对于许多初学者来说,网络通信程序的开发,普遍的一个现象就是觉得难以入手.许多概念,诸如:同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)等,初学者往往迷惑不清, ...

  7. PHP页面之间跳转方法总结

    编程中,在页面之间进行跳转是必须的.这里列出了三种办法,供参考. 一.用HTTP头信息 也就是用PHP的HEADER函数.PHP里的HEADER函数的作用就是向浏览器发出由HTTP协议规定的本来应该通 ...

  8. HTML1.0 - html 环境搭建 开发工具

    1. mac  电脑 2. Hbuilder 开发软件 3. 学习基础 HTML 语法 网站  http://www.w3school.com.cn

  9. JavaScript: Class.method vs Class.prototype.method

    在stack overflow中看到一个人回答,如下   // constructor function function MyClass () { var privateVariable; // p ...

  10. prototype vs __proto__ 之间关系

    __proto__ is the actual object that is used in the lookup chain to resolve methods, etc. __proto__是解 ...