使用pyqt4編寫介面後台程式的方法總結
一、怎麼建立多執行緒
介面程式如果有稍微耗時一點的任務如果不使用多執行緒就會介面卡死,所以大多數情況會使用到多執行緒。pyqt4自己有多執行緒的機制,可以派生多執行緒類然後生成多執行緒例項。**如下:
1 form pyqt4.qtcore import *23class
mythread(qthread):
4def
__init__
(self,func,args):
5 super(mythread,self).__init__
()6 self.func =func
7 self.args =args89
defrun(self):
10 self.func(self,args)
在建立執行緒時,只要向mythread例項傳參,引數內容為實際要呼叫的耗時函式及其引數就可以了,如下:
classui():
self.thread1 =mythread(func,args)
self.thread1.start()
#此處開始自動呼叫執行緒的run函式
ps:在乙個程式中只有乙個主線程,在介面程式中該主線程就是介面所在的執行緒,其他產生的執行緒都是子執行緒;子執行緒建立後執行任務,當任務執行完後會自動消亡,所以可以對每個耗時的任務分別設定乙個新的執行緒是沒有問題的
二、如何在介面中列印日誌
此處我分為了兩種情況,第一種是需要使用執行緒的耗時任務的日誌,第二種是不需要使用執行緒的任務的日誌。
1、使用執行緒呼叫任務函式
1 form pyqt4.qtcore import *23class
mythread(qthread):
4 sendlog =pyqtsignal(str)
5def
__init__
(self,func,args,s):
6 super(mythread,self).__init__
()7 self.func =func
8 self.args =args
9 self.s =s
10def
run(self):
11self.sendlog.connect(self.s)
12 self.func(self,args,self.sendlog)
在被執行緒呼叫的func中接收signal,然後有log要顯示時用signal.emit(log),其中需將log變為unicode字元否則介面顯示中文會有亂碼
2、不使用執行緒
在任務類中建立與上面相同的訊號,在主介面中進行connect。此處有乙個問題需注意,如果建立訊號的類不是派生類就會報錯,我是讓類隨便繼承了乙個類qfile後問題就沒有了
三、關於訊號的定義及引用
訊號需要定義在類的初始化函式外,且為類屬性,不能是例項屬性,即定義時訊號名前面沒有self
引用signal時必須用類的例項,因為用例項引用時pyqt就會自動把訊號同例項繫結即產生乙個繫結的訊號,繫結的訊號才有connect()、emit()等方法,類直接引用訊號嘗試connect時,會有編譯錯誤: attributeerror:"pyqt4.qtcore.pyqtsignal" object has no attribute "connect"
使用cx Freeze打包PyQt4程式
pyqt源程式exam1.py usr bin env python import sys,sip sip是qt要求的,必須加 from pyqt4 import qtgui,qtcore class mywidget qtgui.qwidget def init self,parent none ...
pyqt4學習筆記
訊號與槽機制作為qt最重要的特性,提供了任意兩個qt物件之間的通訊機制。其中,訊號會在某個特定情況或動作下被觸發,槽是用於接收並處理訊號的函式。例如,要將乙個視窗中的變化情況通知給另乙個視窗,則乙個視窗傳送訊號,另乙個視窗的槽接收此訊號並進行相應的操作,即可實現兩個視窗之間的通訊。這比傳統的圖形化程...
PyQt4 登陸介面
對於初次做gui程式的人來說,確實登陸視窗程式會造成困惑,以前做delphi時也有人問過我,好不容易人家才理解清楚,pyqt也是一樣的。一般有兩種處理方式 第一種 在開啟主窗體前開啟登陸對話方塊,如果登陸成功,再建立主窗體並開啟 第二種 在建立主窗體後,在顯示主窗體前開啟登陸對話方塊,如果登陸成功,...