目錄
1--引入多線程的原因
2--PyQt多線程的基本知識(shí)
3--多線程登錄程序的實(shí)例
4--參考
1--引入多線程的原因
① 如果Qt只采用單線程任務(wù)的方式,當(dāng)遇到數(shù)據(jù)處理慢的情形時(shí),會(huì)出現(xiàn)GUI卡死的情況。
② 使用下述例子展示單線程任務(wù)的缺陷:
③ 代碼:
import sys
import time
from PyQt5 import uic
from PyQt5.QtCore import QThread
from PyQt5.QtWidgets import QWidget, QApplication
class MyThread(QThread):
def __init__(self):
super().__init__()
def run(self):
for i in range(10):
print("是MyThread線程中執(zhí)行....%d" % (i + 1))
time.sleep(1)
class MyWin(QWidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
self.ui = uic.loadUi("./thread.ui")
# 從ui文件中加載控件
line_edit = self.ui.lineEdit
btn1 = self.ui.pushButton
btn2 = self.ui.pushButton_2
# 控件綁定槽函數(shù)
btn1.clicked.connect(self.click_1)
btn2.clicked.connect(self.click_2)
def click_1(self):
for i in range(10):
print("是UI線程中執(zhí)行....%d" % (i + 1))
time.sleep(1)
def click_2(self):
self.my_thread = MyThread() # 創(chuàng)建線程
self.my_thread.start() # 開(kāi)始線程
if __name__ == "__main__":
app = QApplication(sys.argv)
myshow = MyWin()
myshow.ui.show()
sys.exit(app.exec_())
④ 結(jié)果展示:
當(dāng)點(diǎn)擊第一個(gè)button時(shí),GUI會(huì)出現(xiàn)卡頓無(wú)法顯示輸出的問(wèn)題;當(dāng)點(diǎn)擊第二個(gè)button時(shí),GUI可以正常工作,輸入框可以正常顯示輸入的內(nèi)容。
2--PyQt多線程的基本知識(shí)
① 通過(guò)繼承父類(lèi)QThread可以新建子線程;
② 線程之間可以通過(guò)信號(hào)進(jìn)行交互,并通過(guò)其槽函數(shù)執(zhí)行對(duì)應(yīng)的功能;
③ 常用函數(shù):(后面會(huì)專(zhuān)門(mén)寫(xiě)一篇筆記,其內(nèi)容是如何在線程之間通過(guò)信號(hào)傳遞opencv圖片、numpy數(shù)組等數(shù)據(jù)格式)
signal = pyqtSignal(str); # 創(chuàng)建信號(hào)
signal.emit(json);?# 發(fā)送信號(hào)
json = json.dumps(data); # 將數(shù)據(jù)序列化封裝
data = json.loads(json); # 將數(shù)據(jù)還原
3--多線程登錄程序的實(shí)例
① 基于Qt Designer設(shè)計(jì) ui 文件:
?② 代碼:
import json
import sys
import time
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5 import uic
# 子線程
class LoginThread(QThread):
# 創(chuàng)建信號(hào) 接受字符串(這里用于主線程向子線程傳遞信息)
start_login_signal = pyqtSignal(str)
def __init__(self, signal):
super().__init__()
# 信號(hào)綁定槽函數(shù)
self.start_login_signal.connect(self.login_by_requests)
self.login_complete_signal = signal
def login_by_requests(self, user_password_json):
# 將json字符串轉(zhuǎn)換
user_password_dict = json.loads(user_password_json)
user_name = user_password_dict.get("user_name")
password = user_password_dict.get("password")
print(user_name, password)
# 比對(duì)登錄信息,返回登錄狀態(tài)(可自由擴(kuò)充)
if user_name == "liujinfu" and password == "liujinfu":
self.login_complete_signal.emit(json.dumps(True)) # 返回True
else:
self.login_complete_signal.emit(json.dumps(False)) # 返回False
def run(self):
while True: # 讓子線程一直運(yùn)行,等待主線程(ui線程)下發(fā)的任務(wù)
print("子線程正在等待執(zhí)行....")
time.sleep(2)
# 主線程
class MyWindow(QWidget):
# 創(chuàng)建信號(hào)(這里用于子線程向主線程返回信息)
login_status_signal = pyqtSignal(str)
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
self.ui = uic.loadUi("./login.ui") # 加載由Qt Designer設(shè)計(jì)的ui文件
self.user_name_qwidget = self.ui.lineEdit # 用戶名輸入框
self.password_qwidget = self.ui.lineEdit_2 # 密碼輸入框
self.login_btn = self.ui.pushButton # 登錄按鈕
self.forget_btn = self.ui.pushButton_2 # 忘記密碼按鈕
self.text_browser = self.ui.textBrowser # 文本顯示區(qū)域
# 綁定槽函數(shù)
self.login_btn.clicked.connect(self.login)
self.login_thread = LoginThread(self.login_status_signal) # 登錄子線程
self.login_thread.start() # 讓子線程開(kāi)始工作
self.login_status_signal.connect(self.login_status)
def login(self):
# 實(shí)現(xiàn)登錄函數(shù)
self.user_name = self.user_name_qwidget.text()
self.password = self.password_qwidget.text()
# 發(fā)送信號(hào),讓子線程開(kāi)始登錄
self.login_thread.start_login_signal.emit(json.dumps({"user_name": self.user_name, "password": self.password}))
def login_status(self, status):
# 根據(jù)登錄狀態(tài)打印信息(可自由擴(kuò)充)
if json.loads(status):
self.text_browser.setText("Welcome %s !" % self.user_name)
self.text_browser.repaint()
else:
self.text_browser.setText("User_name or password is not correct, please try again !")
self.text_browser.repaint()
if __name__ == '__main__':
app = QApplication(sys.argv) # 創(chuàng)建對(duì)象
w = MyWindow()
# 展示窗口
w.ui.show()
# 程序進(jìn)行循環(huán)等待狀態(tài)
app.exec_()
③ 結(jié)果展示:
注:后面會(huì)專(zhuān)門(mén)寫(xiě)一篇筆記,其內(nèi)容是如何在線程之間通過(guò)信號(hào)傳遞opencv圖片、numpy數(shù)組等數(shù)據(jù)格式文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-415527.html
4--參考
PyQt5 快速入門(mén)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-415527.html
到了這里,關(guān)于PyQt5學(xué)習(xí)筆記--多線程處理、數(shù)據(jù)交互的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!