使用PyQt4写界面后台程序方法总结

使用PyQt4编写界面后台程序的方法总结

一、怎么建立多线程

  界面程序如果有稍微耗时一点的任务如果不使用多线程就会界面卡死,所以大多数情况会使用到多线程。PyQt4自己有多线程的机制,可以派生多线程类然后生成多线程实例。代码如下:

 1 form PyQt4.QtCore import *
 2
 3 class MyThread(QThread):
 4     def __init__(self,func,args):
 5         super(MyThread,self).__init__()
 6         self.func = func
 7         self.args = args
 8
 9     def run(self):
10             self.func(self,args)

  在创建线程时,只要向MyThread实例传参,参数内容为实际要调用的耗时函数及其参数就可以了,如下:

class Ui():
    self.thread1 = MyThread(func,args)
    self.thread1.start() #此处开始自动调用线程的run函数

PS:在一个程序中只有一个主线程,在界面程序中该主线程就是界面所在的线程,其他产生的线程都是子线程;子线程创建后执行任务,当任务执行完后会自动消亡,所以可以对每个耗时的任务分别设置一个新的线程是没有问题的

二、如何在界面中打印日志

  此处我分为了两种情况,第一种是需要使用线程的耗时任务的日志,第二种是不需要使用线程的任务的日志。

1、使用线程调用任务函数

    这种情况下,在线程类中创建信号并将其作为参数传给任务函数,在主界面类中connect,代码如下:

 1 form PyQt4.QtCore import *
 2
 3 class MyThread(QThread):
 4      sendlog = pyqtSignal(str)
 5      def __init__(self,func,args,s):
 6          super(MyThread,self).__init__()
 7          self.func = func
 8          self.args = args
 9          self.s = s
10      def run(self):
11           self.sendlog.connect(self.s)
12           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"

时间: 2024-10-07 09:19:03

使用PyQt4写界面后台程序方法总结的相关文章

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

简单的说,这是一个没有界面的后台运行的应用程序 而且,还有一功能:开机自启动,启动运行一个服务 程序结构非常简单,两个类,一个是service的扩展类,一个是BroadcastReceiver扩展类 [java]view plain copy print? import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.util.Log; import and

Unbun命令行运行后台程序方法

假设要用命令运行easystroke程序,并且不依赖命令行进程,有如下2种方法: 法一: $easystroke & $exit 法二: $nohup easystroke 以上2种方法中,法一在手动广播shell窗口时,会使程序退出;法二在<ctrl-c>时,会使程序退出. 若想程序不受以上2种可能退出的操作影响,可如下使用: $nohup easystroke &

C#后台程序与HTML页面中JS方法互调(功能类似于Ajax中的DWR)

此方法适用于 C#中嵌入WebBrowser(浏览器) 通过浏览器中加载的页面与C#的后台代码进行交互. 一.C#程序 1.在C#窗体中添加WebBrowser(浏览器),将页面的URL添加到浏览器中. 2.窗体代码添加 using System.Runtime.InteropServices;//和Html页面交互使用 在类的上一行添加 [ComVisible(true)]//和Html页面交互使用 在类的构造其中添加 this.webB.ObjectForScripting = this;

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

有时候我们的Macbook电脑运行某个程序卡在那里耗了很长时间,程序本身有可能提供了取消按钮,点了也没有反应,这时候我们就很想强制关闭它了,那么Macbook怎么强制关闭后台运行的程序呢?下面完美小编就给大家带来几种关于Macbook怎么关闭后台程序的方法. 1.方法1: 我觉得最好得办法,按下快捷键:Command+Option+Esc来打开"强制退出应用程序"的窗口,然后选中你需要退出的程序,再点右下方的"强制退出"即可. 2.方法2: 如果你非常确定你正处于当

ios后台程序持续运行方法

iOS系统的资源是有限的,应用程序在前台和在后台的状态是不一样的.在后台时,程序会受到系统的很多限制,这样可以提高电池的使用和用户体验.但是有很多社交类的软件,如果因为它在后台就不能刷新到新的数据的话,那么这回影响到用户的体验,下面是将程序退到后台后可以继续运行儿不被系统清除的方法. 在appdelegate中 - (void)applicationDidEnterBackground:(UIApplication *)application{ UIBackgroundTaskIdentifie

没有基础也能写个小程序

文章记录了小程序的设计思路,介绍了使用的技术,描述了提交审核的故事,还提供了最终的完整源码 背景说明 微信小程序自从发布以来就占据着超高的话题热度,一直以来都想开发一款自己的小程序,但苦于不懂前端迟迟没有开始.偶然发现了ColorUI这个开源的小程序组件库,界面好看且提供Demo,心中狂喜马上动手 做个什么小程序呢?想了一圈这半年多一直坚持在写技术文章,为此开通了微信公众号,因为公众号查看文章列表不友好,且不方便在微信以外的渠道传播,我又利用Github Pages搭建了运维咖啡吧网站主页,就想

Java 并发编程之图形界面应用程序及死锁问题

不知道为什么这本书还要讲一个界面应用程序,Java的界面做的很糟糕,效率低下,而且界面是java的弱项,可能是因为这里边是有一些并发编程的知识吧. 为什么GUI是单线程的 无论是Swing还是AWT都是单线程的.但它不仅限于在java中,在Qt,NexiStep,macOs CoCoa X windows以及其它环境中的GUI框架都是单线程的,许多人都曾经尝试编写多线程的GUI框架,但最终都由于竞态条件和死锁导致的稳定性问题而又重新回到单线程的事件队列模型:采用一个专门的线程从队列中抽取事件,并

45种攻入网站后台的方法

45种攻入后台的方法1.到Google搜索,site:cq.cn inurl:asp2.到Google,搜索一些关键字,edit.asp? 韩国肉鸡为多,多数为MSSQL数据库!3.利用挖掘鸡和一个ASP木马:文件名是login.asp……路径组是/manage/关键词是went.asp用’or’='or’来登陆4.以下这个方法因为太多人做过,所以一些网站管理员对此都有防范之心了,成功率不高:关键字:“Co Net MIB Ver 1.0网站后台管理系统”帐号密码为 ‘or’='or’5.动感购

JSF页面中使用js函数回调后台bean方法并获取返回值的方法

由于primefaces在国内使用的并不是太多,因此,国内对jsf做系统.详细的介绍的资料很少,即使有一些资料,也仅仅是对国外资料的简单翻译或者是仅仅讲表面现象(皮毛而已),它们的语句甚至还是错误的,很可能会误导使用者. 相对来说,看国内的那些仅仅是翻译过来的文章或书籍不如直接看国外的官方文档或资料来的实在,在我讲述jsf页面中如何使用js调用后台bean方法之前,先给大家说几个国外的资料.在primefaces官方网站上,你可以搜索到几乎所有你需要的东西,primefaces官网为:http: