使用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. java-Mysql-SQLServer数据类型匹配速查表

    java-Mysql-SQLServer数据类型匹配速查表 Mysql ************************************ 当前列 ClassName ColumnType Di ...

  2. 转:单片机C语言中的data,idata,xdata,pdata,code

    从数据存储类型来说,8051系列有片内.片外程序存储器,片内.片外数据存储器,片内程序存储器还分直接寻址区和间接寻址类型,分别对应code.data.xdata.idata以及根据51系列特点而设定的 ...

  3. Vector3.Dot 与Vector3.Cross

    Vector3.Dot(点积) : 点积的计算方式为:  a·b=|a|·|b|cos<a,b>; 其中<a,b>和<b,a> 夹角不分顺序; 物理学中点积用来计算 ...

  4. Oracle 基本命令

    (1)查看所有表 >select * from tab; (2)查看表结构 >desc 表名; (3)将查询出来的字段显示为其他名称 >select empno as 员工编号 fr ...

  5. PHP 中的静态变量的简单使用

    静态变量的初始化只能在第一次static 声明的时候进行,这些静态变量只能在声明他的函数中访问到. 例如: <?php function do_something(){ static $firs ...

  6. java多线程下单例的实现

    Abstract 在开发中,如果某个实例的创建需要消耗很多系统资源,那么我们通常会使用惰性加载机制,也就是说只有当使用到这个实例的时候才会创建这个实例,这个好处在单例模式中得到了广泛应用.这个机制在s ...

  7. Mediator pattern(c++ 实现)

    概述: 假设我们开发一个图片处理软件,里面肯定包括很多相关功能,比如说剪切,旋转,滤镜,美化等等,而我们这些功能所要处理的对象是固定的,就是我们所显示的那张图片.但是我们不能把所有的功能罗列到一个ta ...

  8. OpenRTSP的使用

    由于需要研究OpenRTSP的源码,所以先学习下使用. -d [time]--------这个是录制时间,就是单位秒,超时后,程序自动结束. -i   -----------以.avi文件格式生成. ...

  9. Visual Studio新建的源文件的默认编码

    原来VS新建的源文件默认的编码是根据系统locale选择的.我的是国标2312.我草.可坑死我了.一直不知道. 当时主要是需要用doxygen生成html文档,它默认的输入文件的格式是UTF-8,是不 ...

  10. 如何实现室内Wi-Fi无线终端的精准定位

    如何实现室内Wi-Fi无线终端的精准定位 如何实现室内Wi-Fi无线终端的精准定位 随着商圈020的兴起,室内定位技术的也如百花争艳般不断涌现.但随着室内Wi-Fi网的架设普及,基于Wi-Fi定位技术 ...