国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

PyQt5學(xué)習(xí)筆記--多線程處理、數(shù)據(jù)交互

這篇具有很好參考價(jià)值的文章主要介紹了PyQt5學(xué)習(xí)筆記--多線程處理、數(shù)據(jù)交互。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

目錄

1--引入多線程的原因

2--PyQt多線程的基本知識(shí)

3--多線程登錄程序的實(shí)例

4--參考


1--引入多線程的原因

① 如果Qt只采用單線程任務(wù)的方式,當(dāng)遇到數(shù)據(jù)處理慢的情形時(shí),會(huì)出現(xiàn)GUI卡死的情況。

② 使用下述例子展示單線程任務(wù)的缺陷:

PyQt5學(xué)習(xí)筆記--多線程處理、數(shù)據(jù)交互

③ 代碼:

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)容。

PyQt5學(xué)習(xí)筆記--多線程處理、數(shù)據(jù)交互

PyQt5學(xué)習(xí)筆記--多線程處理、數(shù)據(jù)交互

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 文件:

PyQt5學(xué)習(xí)筆記--多線程處理、數(shù)據(jù)交互

?② 代碼:

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é)果展示:

PyQt5學(xué)習(xí)筆記--多線程處理、數(shù)據(jù)交互

PyQt5學(xué)習(xí)筆記--多線程處理、數(shù)據(jù)交互

注:后面會(huì)專(zhuān)門(mén)寫(xiě)一篇筆記,其內(nèi)容是如何在線程之間通過(guò)信號(hào)傳遞opencv圖片、numpy數(shù)組等數(shù)據(jù)格式

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)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • PyQt5 QWebEngineView網(wǎng)頁(yè)交互

    PyQt5 QWebEngineView網(wǎng)頁(yè)交互

    方法 描述 load(QUrl url) 加載指定的URL并顯示 setHtml(QString html) 將網(wǎng)頁(yè)視圖的內(nèi)容設(shè)置為指定的HTML內(nèi)容 核心代碼: view = QWebEngineView() view.load(QUrl(‘http://www.xxx.com’)) view.show()

    2023年04月19日
    瀏覽(15)
  • 實(shí)習(xí)記錄(5)——PyQT5界面設(shè)計(jì)及交互

    實(shí)習(xí)記錄(5)——PyQT5界面設(shè)計(jì)及交互

    首先按照甲方PPT上給的界面做了,在寫(xiě)內(nèi)部邏輯的時(shí)候發(fā)現(xiàn)有不少問(wèn)題,沒(méi)考慮到使用者的感受,甚至我覺(jué)得根本用不了。于是我和小哥討論了一下之后,我按照我的想法做了一個(gè)新的頁(yè)面出來(lái),能實(shí)現(xiàn)需求的同時(shí),讓使用的人體驗(yàn)更好也更直觀。 昨天安裝成功了PyQT5,今天

    2023年04月24日
    瀏覽(20)
  • pyqt5 如何終止正在執(zhí)行的線程?

    在 PyQt5 中終止正在執(zhí)行的線程,可以通過(guò)一些協(xié)調(diào)的方法來(lái)實(shí)現(xiàn)。一般情況下,直接強(qiáng)行終止線程是不安全的,可能會(huì)導(dǎo)致資源泄漏或者程序異常。相反,我們可以使用一種協(xié)作的方式,通知線程在合適的時(shí)候自行退出。 以下是一種常見(jiàn)的方法,使用標(biāo)志位來(lái)通知線程停止

    2024年02月14日
    瀏覽(26)
  • PyQt5多線程的執(zhí)行和停止

    PyQt5多線程的執(zhí)行和停止

    參考資料:?jiǎn)袅▎袅?pyqt5 thread多線程示例 以下代碼來(lái)自該視頻,我自己手動(dòng)實(shí)現(xiàn)了一下,當(dāng)作一個(gè)模板來(lái)學(xué)習(xí),歡迎大家一起學(xué)習(xí)。 運(yùn)行示例 三個(gè)進(jìn)程同時(shí)執(zhí)行,并且可以單獨(dú)控制暫停和繼續(xù)執(zhí)行。 以下給出運(yùn)行代碼: 完整程序參考:PyQt5 多線程執(zhí)行和停止示例

    2024年02月16日
    瀏覽(20)
  • python pyqt5 如何點(diǎn)擊按鈕,打開(kāi)文件夾選擇目錄

    您可以使用PyQt5的QFileDialog類(lèi)來(lái)實(shí)現(xiàn)打開(kāi)文件夾選擇目錄的功能。下面是一個(gè)示例代碼,演示了如何創(chuàng)建一個(gè)窗口,包含一個(gè)按鈕,點(diǎn)擊按鈕后彈出文件夾選擇對(duì)話框并返回所選目錄的路徑: import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QFileDialog class MainWindow(Q

    2024年02月10日
    瀏覽(22)
  • 探索文件與交互:使用PyQt5構(gòu)建一個(gè)高級(jí)文件選擇器

    探索文件與交互:使用PyQt5構(gòu)建一個(gè)高級(jí)文件選擇器

    在當(dāng)今的應(yīng)用程序開(kāi)發(fā)中,文件管理和交互是一個(gè)重要的組成部分。特別是對(duì)于桌面應(yīng)用程序,提供一個(gè)直觀、功能豐富的文件選擇器是提高用戶體驗(yàn)的關(guān)鍵。 本篇博客,我將介紹如何使用Python和PyQt5來(lái)構(gòu)建一個(gè)高級(jí)的文件選擇器,它不僅能瀏覽文件,還能預(yù)覽圖片,編輯文

    2024年01月24日
    瀏覽(25)
  • Pyqt5實(shí)現(xiàn)新線程更新窗口UI

    Pyqt5實(shí)現(xiàn)新線程更新窗口UI

    我們用pyqt5開(kāi)發(fā)窗口應(yīng)用時(shí),應(yīng)用會(huì)執(zhí)行一些耗時(shí)的操作,如復(fù)制大量文件,下載大量數(shù)據(jù)等。一般情況下,在這些操作沒(méi)有完成時(shí),窗口的UI處于“假死”狀態(tài),不會(huì)更新,只有所有操作完成后,窗口的狀態(tài)才會(huì)更新。這樣對(duì)用戶使用非常不友好。 使用多線程技術(shù),在新線

    2024年02月13日
    瀏覽(23)
  • PyQt5 多線程和異步刷新UI

    以下簡(jiǎn)介一個(gè)基本的PyQt程序。 需要導(dǎo)入的類(lèi)主要來(lái)自三個(gè)包 from PyQt5.QtWidgets import 常用的控件 PyQt5.QtCore 核心功能類(lèi),如QT,QThread,pyqtSignal PyQt5.QtGui UI類(lèi),如QFont 基礎(chǔ)的程序結(jié)構(gòu): 注意: 使用join方法會(huì)讓主線程阻塞在這里,等待子線程結(jié)束,在里面可以設(shè)置阻塞的時(shí)間 a

    2024年02月11日
    瀏覽(17)
  • PyQt5之事件處理

    PyQt5之事件處理

    Widget - event 基于窗體的應(yīng)用程序都是由事件驅(qū)動(dòng)的,列如:鼠標(biāo)事件(鼠標(biāo)的單擊雙擊)、鍵盤(pán)事件(按鍵的按下釋放)、窗體繪制事件(某個(gè)事件的重繪)等,產(chǎn)生的事件進(jìn)入一個(gè)事件隊(duì)列,由應(yīng)用程序的事件循環(huán)進(jìn)行處理。 在PyQt5中,事件是一種對(duì)象,由抽象類(lèi)QEvent表示

    2024年02月11日
    瀏覽(16)
  • 【PyQt5實(shí)現(xiàn)多線程更新UI】- 提高程序效率,優(yōu)化用戶體驗(yàn)

    【PyQt5實(shí)現(xiàn)多線程更新UI】- 提高程序效率,優(yōu)化用戶體驗(yàn) 在PyQt5應(yīng)用程序的開(kāi)發(fā)中,當(dāng)程序需要處理大量數(shù)據(jù)或進(jìn)行復(fù)雜的計(jì)算時(shí),如果僅使用主線程,會(huì)導(dǎo)致GUI界面失去響應(yīng),用戶體驗(yàn)較差。為了解決這個(gè)問(wèn)題,通常需要使用多線程技術(shù)。 而在使用多線程時(shí),往往需要更新

    2024年02月07日
    瀏覽(16)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包