日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

python GUI庫圖形界面開發之PyQt5線程類QThread詳細使用方法

瀏覽:24日期:2022-08-06 11:37:49

QThread是Qt的線程類中最核心的底層類。由于PyQt的的跨平臺特性,QThread要隱藏所有與平臺相關的代碼

要使用的QThread開始一個線程,可以創建它的一個子類,然后覆蓋其它QThread.run()函數

class Thread(QThread): def __init __(self): super(Thread,self).__ init __() def run(self): #線程相關的代碼 pass

接下來創建一個新的線程

thread = Thread()thread.start()

可以看出,PyQt的線程使用非常簡單—-建立一個自定義的類(如thread),自我繼承自QThread ,并實現其run()方法即可

在使用線程時可以直接得到Thread實例,調用其start()函數即可啟動線程,線程啟動之后,會自動調用其實現的run()的函數,該方法就是線程的執行函數

業務的線程任務就寫在run()函數中,當run()退出之后線程就基本結束了,QThread有started和finished信號,可以為這兩個信號指定槽函數,在線程啟動和結束之時執行一段代碼進行資源的初始化和釋放操作,更靈活的使用方法是,在自定義的QThread實例中自定義信號,并將信號連接到指定的槽函數,當滿足一定的業務條件時發射此信號

QThread類中的常用方法 方法 描述 start() 啟動線程 wait() 阻止線程,直到滿足如下條件之一 與此QThread對象關聯的線程已完成執行(即從run返回時),如果線程完成執行,此函數返回True,如果線程尚未啟動,也返回True 等待時間的單位是毫秒,如果時間是ULONG_MAX(默認值·),則等待,永遠不會超時(線程必須從run返回),如果等待超時,此函數將會返回False sleep() 強制當前線程睡眠多少秒 QThread類中的常用信號 信號 描述 started 在開始執行run函數之前,從相關線程發射此信號 finished 當程序完成業務邏輯時,從相關線程發射此信號 QThread的使用方法實例

import sysfrom PyQt5.QtWidgets import *from PyQt5.QtCore import *from PyQt5.QtGui import *class MainWidget(QWidget): def __init__(self, parent=None): super(MainWidget, self).__init__(parent) #設置標題 self.setWindowTitle(’QThread多線程例子’) #實例化多線程對象 self.thread = Worker() #實例化列表控件與按鈕控件 self.listFile = QListWidget() self.btnStart = QPushButton(’開始’) #把控件放置在柵格布局中 layout = QGridLayout(self) layout.addWidget(self.listFile, 0, 0, 1, 2) layout.addWidget(self.btnStart, 1, 1) #信號與槽函數的連接 self.btnStart.clicked.connect(self.slotStart) self.thread.sinOut.connect(self.slotAdd) def slotAdd(self, file_inf): #向列表控件中添加條目 self.listFile.addItem(file_inf) def slotStart(self): #開始按鈕不可點擊,線程開始 self.btnStart.setEnabled(False) self.thread.start()class Worker(QThread): sinOut = pyqtSignal(str) def __init__(self, parent=None): super(Worker, self).__init__(parent) #設置工作狀態與初始num數值 self.working = True self.num = 0 def __del__(self): #線程狀態改變與線程終止 self.working = False self.wait() def run(self): while self.working == True: #獲取文本 file_str = ’File index{0}’.format(self.num) self.num += 1 # 發射信號 self.sinOut.emit(file_str) # 線程休眠2秒 self.sleep(2)if __name__ == ’__main__’: app = QApplication(sys.argv) demo = MainWidget() demo.show() sys.exit(app.exec_())

運行效果圖如下

python GUI庫圖形界面開發之PyQt5線程類QThread詳細使用方法

代碼分析

在這個例子中,單擊開始按鈕,會在后臺定時讀取數據,并把返回的數據顯示在界面中,首先使用以下代碼進行布局,把列表控件和按鈕控件放在柵格布局管理器中

#實例化列表控件與按鈕控件self.listFile = QListWidget()self.btnStart = QPushButton(’開始’)#把控件放置在柵格布局中layout = QGridLayout(self)layout.addWidget(self.listFile, 0, 0, 1, 2)layout.addWidget(self.btnStart, 1, 1)

然后將按鈕的clicked信號連接到槽函數,單擊開始觸發槽函數

self.btnStart.clicked.connect(self.slotStart)def slotStart(self): #開始按鈕不可點擊,線程開始 self.btnStart.setEnabled(False) self.thread.start()

比較復雜的是線程的信號,將線程的sinOut信號連接到slotAdd()槽函數,SlotAdd()函數負責在列表控件中動態添加字符串條目

self.thread.sinOut.connect(self.slotAdd)def slotAdd(self,file_inf): #向列表控件中添加條目 self.listFile.addItem(file_inf)

定義一個線程類,繼承自QThread,當線程啟動時,執行run()函數

class Worker(QThread): sinOut = pyqtSignal(str) def __init__(self, parent=None): super(Worker, self).__init__(parent) #設置工作狀態與初始num數值 self.working = True self.num = 0 def __del__(self): #線程狀態改變與線程終止 self.working = False self.wait() def run(self): while self.working == True: #獲取文本 file_str = ’File index{0}’.format(self.num) self.num += 1 # 發射信號 self.sinOut.emit(file_str) # 線程休眠2秒 self.sleep(2)多線程失敗案例

import sysfrom PyQt5.QtWidgets import *from PyQt5.QtCore import *from PyQt5.QtGui import *global secsec=0def setTime(): global sec sec+=1 #Led顯示數字+1 lcdNumber.display(sec)def work(): #計時器每秒計數 timer.start(1000) for i in range(200000000): pass timer.stop()if __name__ == ’__main__’: app=QApplication(sys.argv) top=QWidget() top.resize(300,120) #垂直布局 layout=QVBoxLayout(top) #添加一個顯示面板 lcdNumber=QLCDNumber() layout.addWidget(lcdNumber) button=QPushButton(’測試’) layout.addWidget(button) timer=QTimer() #每次計時結束,觸發setTime timer.timeout.connect(setTime) button.clicked.connect(work) top.show() sys.exit(app.exec_())

失敗效果圖如下

python GUI庫圖形界面開發之PyQt5線程類QThread詳細使用方法

長時間停留在此界面,知道多線程任務完成后,此界面才會動,當耗時程序非常大時,就會造成程序運行失敗的假象,實際還是在后臺運行的,只是沒有顯示在主窗口的界面上,當然用戶體驗也就非常差,那么如何解決這個問題呢,下面實例三進行解答

分離UI主線程與工作線程實例

import sysfrom PyQt5.QtCore import *from PyQt5.QtGui import *from PyQt5.QtWidgets import *global secsec = 0class WorkThread(QThread): #實例化一個信號對象 trigger = pyqtSignal() def __int__(self): super(WorkThread, self).__init__() def run(self): #開始進行循環 for i in range(2000000000): pass # 循環完畢后發出信號 self.trigger.emit()def countTime(): global sec sec += 1 # LED顯示數字+1 lcdNumber.display(sec)def work(): # 計時器每秒計數 timer.start(1000) # 計時開始 workThread.start() # 當獲得循環完畢的信號時,停止計數 workThread.trigger.connect(timeStop)def timeStop(): #定時器停止 timer.stop() print('運行結束用時', lcdNumber.value()) global sec sec = 0if __name__ == '__main__': app = QApplication(sys.argv) top = QWidget() top.resize(300, 120) # 垂直布局類QVBoxLayout layout = QVBoxLayout(top) # 加顯示屏,按鈕到布局中 lcdNumber = QLCDNumber() layout.addWidget(lcdNumber) button = QPushButton('測試') layout.addWidget(button) #實例化定時器與多線程類 timer = QTimer() workThread = WorkThread() button.clicked.connect(work) # 每次計時結束,觸發 countTime timer.timeout.connect(countTime) top.show() sys.exit(app.exec_())

運行效果,程序主界面的數值會每秒增加1,直到循環結束,這里就避免了主界面長時間不動的尷尬!

python GUI庫圖形界面開發之PyQt5線程類QThread詳細使用方法

QThread線程事件處理實例

對于執行很耗時的程序來說,由于PyQt需要等待程序執行完畢才能進行下一步,這個過程表現在界面上就是卡頓,而如果需要執行這個耗時程序時不斷的刷新界面。那么就可以使用QApplication.processEvents(),那么就可以一邊執行耗時程序,一邊刷新界面的功能,給人的感覺就是程序運行很流暢,因此QApplicationEvents()的使用方法就是,在主函數執行耗時操作的地方,加入QApplication.processEvents()

import sys,timefrom PyQt5.QtWidgets import QWidget,QPushButton,QApplication,QListWidget,QGridLayoutclass WinForm(QWidget): def __init__(self,parent=None): super(WinForm, self).__init__(parent) #設置標題與布局方式 self.setWindowTitle(’實時刷新界面的例子’) layout=QGridLayout() #實例化列表控件與按鈕控件 self.listFile=QListWidget() self.btnStart=QPushButton(’開始’) #添加到布局中指定位置 layout.addWidget(self.listFile,0,0,1,2) layout.addWidget(self.btnStart,1,1) #按鈕的點擊信號觸發自定義的函數 self.btnStart.clicked.connect(self.slotAdd) self.setLayout(layout) def slotAdd(self): for n in range(10): #獲取條目文本 str_n=’File index{0}’.format(n) #添加文本到列表控件中 self.listFile.addItem(str_n) #實時刷新界面 QApplication.processEvents() #睡眠一秒 time.sleep(1)if __name__ == ’__main__’: app=QApplication(sys.argv) win=WinForm() win.show() sys.exit(app.exec_())

python GUI庫圖形界面開發之PyQt5線程類QThread詳細使用方法

本文詳細介紹了python GUI庫PyQt5的線程類QThread詳細使用方法,想了解更多相關知道請查看下面的相關鏈接

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲伊人精品酒店| 国产精品久久久免费| 国产激情久久| 日本午夜精品一区二区三区电影| 中文字幕日韩欧美精品高清在线| 综合一区av| 7m精品国产导航在线| 国产精品一区二区三区www| 美女久久久久久| 欧美韩日一区| 在线一区视频观看| 伊人久久成人| 亚洲18在线| 青青国产精品| 精品福利久久久| 亚洲成人国产| 蜜桃91丨九色丨蝌蚪91桃色| 在线看片一区| 国产精品一区亚洲| 天堂8中文在线最新版在线| 久久高清免费| 亚洲乱码视频| 精品一区二区三区在线观看视频| 日韩啪啪电影网| 午夜国产精品视频| 日韩精品第二页| 久久精品人人| 亚洲v在线看| 五月亚洲婷婷 | 欧产日产国产精品视频| 91精品一区国产高清在线gif| 国产模特精品视频久久久久| 日韩毛片一区| 国产一区二区三区不卡av| 久久麻豆精品| 日本电影久久久| 国产成人精品三级高清久久91| 欧美亚洲国产激情| 日韩精品三区四区| caoporn视频在线| 亚洲在线一区| 久久精品av麻豆的观看方式| 韩国久久久久久| 在线精品一区| 日韩成人综合| 日韩精品福利一区二区三区| 理论片午夜视频在线观看| 亚洲在线一区| 97视频热人人精品免费| 免费成人在线视频观看| 久久精品九色| 亚洲天堂av资源在线观看| 国产一区二区三区日韩精品 | 在线午夜精品| 国产精品亚洲欧美| 午夜日韩福利| 老牛国内精品亚洲成av人片 | 日日摸夜夜添夜夜添国产精品| 精品免费av| 免费成人av在线播放| 中文在线资源| 国产欧美一区二区三区米奇| av亚洲免费| 精品72久久久久中文字幕| 天堂成人国产精品一区| 国产精品国产三级国产在线观看| 蜜桃视频一区二区三区| 人在线成免费视频| 日韩中文av| 国产二区精品| 国产精品高颜值在线观看| 日韩精品久久久久久| 亚洲高清激情| 九九99久久精品在免费线bt| 免费在线视频一区| 日韩中文影院| 欧美激情视频一区二区三区免费 | 激情欧美亚洲| 精品国产成人| 日韩不卡一二三区| 欧美不卡在线| 色婷婷亚洲mv天堂mv在影片| 欧美日韩在线精品一区二区三区激情综合 | 精品三级在线观看视频| 午夜电影一区| 三级欧美在线一区| 精品中文字幕一区二区三区av| 精品视频网站| 亚洲精品一级| 国产亚洲在线| 国产主播一区| 成人午夜精品| 久久久久久一区二区| 国产精品亚洲二区| 日韩欧美美女在线观看| 久久福利影视| 国产一区成人| 亚洲精品888| 国产99亚洲| 理论片午夜视频在线观看| 麻豆免费精品视频| 国产欧美二区| 91精品视频一区二区| 免费人成在线不卡| 亚洲欧美日本视频在线观看| 免费视频一区三区| 国产综合亚洲精品一区二| 精品亚洲美女网站| 不卡一二三区| 日韩一区三区| 日韩国产一区二区| 日韩一区电影| 久久免费国产| 亚洲不卡av不卡一区二区| 久久久久久久久久久9不雅视频| 日本不卡免费高清视频在线| 福利片在线一区二区| 国产一区二区三区亚洲综合| 麻豆91在线播放| 国产成人免费精品| 日韩av免费大片| 日韩欧美自拍| 亚洲手机在线| 在线视频精品| 亚洲va久久| 国产精品亚洲四区在线观看| 麻豆91精品91久久久的内涵| 福利精品一区| 免费污视频在线一区| 亚洲女同一区| 尹人成人综合网| 在线观看视频免费一区二区三区| 亚洲精品黄色| 日韩高清不卡在线| 国产精品扒开腿做爽爽爽软件| 美女精品久久| 国产精品久久久久av电视剧| 欧美日韩在线观看视频小说| 激情婷婷综合| 中文字幕av一区二区三区人| 涩涩涩久久久成人精品| 国产精品视频一区二区三区四蜜臂 | 日韩欧美高清一区二区三区| 青草国产精品久久久久久| 国产精品自在| 国产一区二区三区不卡视频网站| 日本不良网站在线观看| av一区二区高清| 亚洲精品日本| 久久香蕉网站| 久久久久美女| 亚洲三区欧美一区国产二区| 国产亚洲久久| 国产传媒在线观看| 中文一区二区| 国产探花在线精品一区二区| 欧美aa在线视频| 99久久激情| 亚洲久久一区| 国产一区二区三区91| 免费欧美一区| 奇米777国产一区国产二区| 国产成年精品| 精品日韩毛片| 欧美一级久久| 激情黄产视频在线免费观看| 韩日一区二区三区| 啪啪亚洲精品| 久久人人97超碰国产公开结果| 日韩专区欧美专区| 麻豆一区二区在线| 精品一区在线| 91精品国产一区二区在线观看| 国内精品伊人| 爽好久久久欧美精品| 国产精品亚洲一区二区在线观看| 91tv亚洲精品香蕉国产一区| 日韩国产在线不卡视频| 国产麻豆久久| 久久精品999| 亚洲午夜精品久久久久久app| 97se亚洲| 亚洲精品极品少妇16p| 国产精品欧美一区二区三区不卡| 婷婷久久一区| 欧美a在线观看| 美日韩精品视频| 久久不见久久见中文字幕免费 | 日韩国产一二三区| 久久激情一区| 日韩精品视频网| 欧美~级网站不卡| 老色鬼精品视频在线观看播放| 久久国产精品亚洲77777| 成人精品高清在线视频| 亚洲资源在线| 亚洲午夜精品久久久久久app| 欧美国产免费| 日本在线不卡视频一二三区| 999国产精品999久久久久久|