PyQt 線程類 QThread使用詳解
PyQt中的線程類 QtCore.QThread ,使用時(shí)繼承QThread類
啟動(dòng)界面的線程暫稱為UI線程。界面執(zhí)行命令時(shí)都在自己的UI線程中。
如果在UI線程中執(zhí)行網(wǎng)絡(luò)連接和數(shù)據(jù)庫操作等耗時(shí)的操作,界面會(huì)被卡住,Windows下有可能會(huì)出現(xiàn)“無響應(yīng)”的警告。
阻塞UI線程會(huì)降低用戶體驗(yàn)和應(yīng)用穩(wěn)定性。因此我們可以把耗時(shí)操作放在線程中去執(zhí)行。
QThread代表一個(gè)線程,我們可以復(fù)寫run函數(shù)來執(zhí)行我們要的操作。
QThread可以使用 QtCore.pyqtSignal 來與界面交互和傳輸數(shù)據(jù)。
PyQt4 QThread 代碼示例
•Python2.7
# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtCore
from PyQt4.QtCore import QCoreApplication
from PyQt4.QtGui import QWidget, QPushButton, QApplication, QTextBrowser
class TimeThread(QtCore.QThread):
signal_time = QtCore.pyqtSignal(str, int) # 信號(hào)
def __init__(self, parent=None):
super(TimeThread, self).__init__(parent)
self.working = True
self.num = 0
def start_timer(self):
self.num = 0
self.start()
def run(self):
while self.working:
print "Working", self.thread()
self.signal_time.emit("Running time:", self.num) # 發(fā)送信號(hào)
self.num += 1
self.sleep(1)
class TimeDialog(QWidget):
def __init__(self):
super(TimeDialog, self).__init__()
self.timer_tv = QTextBrowser(self)
self.init_ui()
self.timer_t = TimeThread()
self.timer_t.signal_time.connect(self.update_timer_tv)
def init_ui(self):
self.resize(300, 200)
self.setWindowTitle('TimeDialog')
self.timer_tv.setText("Wait")
self.timer_tv.setGeometry(QtCore.QRect(10, 145, 198, 26))
self.timer_tv.move(0, 15)
btn1 = QPushButton('Quit', self)
btn1.setToolTip('Click to quit')
btn1.resize(btn1.sizeHint())
btn1.move(200, 150)
btn1.clicked.connect(QCoreApplication.instance().quit)
start_btn = QPushButton('Start', self)
start_btn.setToolTip("Click to start")
start_btn.move(50, 150)
self.connect(start_btn, QtCore.SIGNAL("clicked()"), self.click_start_btn)
def click_start_btn(self):
self.timer_t.start_timer()
def update_timer_tv(self, text, number):
self.timer_tv.setText(self.tr(text + " " + str(number)))
if __name__ == '__main__':
app = QApplication(sys.argv)
time_dialog = TimeDialog()
time_dialog.show()
sys.exit(app.exec_())
QThread中使用的信號(hào) signal_time = QtCore.pyqtSignal(str, int) 指定了參數(shù)str和int
發(fā)送信號(hào) self.signal_time.emit("Running time:", self.num)
外部接收信號(hào) self.timer_t.signal_time.connect(self.update_timer_tv)
信號(hào)連接到方法 update_timer_tv(self, text, number) ,注意信號(hào)與方法的參數(shù)要一一對(duì)應(yīng)
使用中我們可以定義多種不同的信號(hào) QtCore.pyqtSignal
啟動(dòng)線程,調(diào)用 start()
相關(guān)文章
python3實(shí)現(xiàn)將json對(duì)象存入Redis以及數(shù)據(jù)的導(dǎo)入導(dǎo)出
這篇文章主要介紹了python3實(shí)現(xiàn)將json對(duì)象存入Redis以及數(shù)據(jù)的導(dǎo)入導(dǎo)出,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-07-07
python自動(dòng)重試第三方包retrying模塊的方法
retrying是一個(gè)python的重試包,可以用來自動(dòng)重試一些可能運(yùn)行失敗的程序段。這篇文章主要介紹了python自動(dòng)重試第三方包retrying的方法,需要的朋友參考下吧2018-04-04
python調(diào)用百度REST API實(shí)現(xiàn)語音識(shí)別
這篇文章主要為大家詳細(xì)介紹了python調(diào)用百度REST API實(shí)現(xiàn)語音識(shí)別,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08

