PyQt——QThread

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

# -*- coding: utf-8 -*- 
'''
    【簡介】
    PyQT5中 QThread 例子
 
  
'''

from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import sys

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)
		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_())

# -*- coding: utf-8 -*- 
'''
    【簡介】
    PyQT5中 QThread 例子
 
  
'''

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *

global sec
sec=0

def setTime():
	global  sec
	sec+=1
	# LED顯示數字+1
	lcdNumber.display(sec)          

def work():
	# 計時器每秒計數
	timer.start(1000)              
	for i in range(2000000000):
		pass
	
	timer.stop()

if __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()
	# 每次計時結束,觸發setTime
	timer.timeout.connect(setTime)      
	button.clicked.connect(work)  
    
	top.show()
	sys.exit(app.exec_())

應用:分離UI主線程與工作線程
# -*- coding: utf-8 -*- 
'''
    【簡介】
    PyQT5中 QTimer例子  

'''

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
    
global sec
sec=0

class 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=0

if __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_())

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章