使用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. MLlib 卡方检验

    1.卡方检验理论 1.1.  简介 总体的分布函数完全未知或只知形式.但不知其参数的情况,为了推断总体的某些未知特性,提出某些关于总体的假设.我们要根据样本对所提出的假设作出是接受,还是拒绝的决策.假 ...

  2. ECMA 6 记入

    好书推荐 : http://es6.ruanyifeng.com/ String.prototype -includes, startsWith, endsWith -padStart, padEnd ...

  3. ural 1180 Stone Game

    http://acm.timus.ru/problem.aspx?space=1&num=1180 #include <cstdio> #include <cstring&g ...

  4. DACL, NULL or not NULL

    上周 hBifTs在折腾他的文件映射封装类的时候,碰到了不能在 ASP.NET 中直接打开由桌面程序创建的内核对象的问题. 内存映射文件与用户权限 他当时是的方法是修改 ASP.NET 配置文件,让 ...

  5. jsonp实现跨域资源访问

    平时项目中处理ajax跨域资源请求时,例如www.example2.com上的某个页面要请求www.example1.com的数据,我们使用得较多的是jsonp方式.jsonp通过JavaScript ...

  6. Qt入门(5)——用Qt控件创建一个电话本界面

    具体实现步骤: 一.首先用 Qt Designer 创建一个两张图的对话框,分别保存为listdialog.ui和editdialog.ui文件 要注意其中各个空间对应的名称修改好 二.新建一个Qt应 ...

  7. 设计模式(十一):FACADE外观模式 -- 结构型模式

    1. 概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性.例子1:一个电源总开关可以控制四盏灯.一个风扇 ...

  8. Delphi Dcp 和BPL的解释

    dcp = delphi compiled package,是 package 编译时跟 bpl 一起产生出来的,记录着 package 中公开的 class.procedure.function.v ...

  9. POJ3294--Life Forms 后缀数组+二分答案 大于k个字符串的最长公共子串

                                                                              Life Forms Time Limit: 500 ...

  10. git与svn对比

    git 与 svn 对比 git的使用不需要联机 SVN集中式版本控制:每个人的版本都是提交到服务器,服务器坏了就雪崩.git分布式版本控制:  安全,每人本地有个版本库,每个人都可以充当‘服务器 它 ...