最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python Pyqt5多線程更新UI代碼實(shí)例(防止界面卡死)

 更新時(shí)間:2021年12月03日 17:23:52   作者:幸福的達(dá)哥  
這篇文章通過代碼實(shí)例給大家介紹了Python Pyqt5多線程更新UI防止界面卡死的問題,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧

"""
在編寫GUI界面中,通常用會(huì)有一些按鈕,點(diǎn)擊后觸發(fā)事件,
比如去下載一個(gè)文件或者做一些操作,
這些操作會(huì)耗時(shí),如果不能及時(shí)結(jié)束,主線程將會(huì)阻塞,
這樣界面就會(huì)出現(xiàn)未響應(yīng)的狀態(tài),因此必須使用多線程來解決這個(gè)問題。
"""

代碼實(shí)例

 
from PyQt5.Qt import (QApplication, QWidget, QPushButton,QThread,QMutex,pyqtSignal)
import sys
import time
 
qmut_1 = QMutex() # 創(chuàng)建線程鎖
qmut_2 = QMutex()
qmut_3 = QMutex()
# 繼承QThread
class Thread_1(QThread):  # 線程1
    def __init__(self):
        super().__init__()
 
    def run(self):
        qmut_1.lock() # 加鎖
        values = [1, 2, 3, 4, 5,6,7,8,9,10]
        print("====     Thread_1    ====")
        for i in values:
            print("Thread_1:",i)
            time.sleep(0.5)  # 休眠
        qmut_1.unlock() # 解鎖
 
 
class Thread_2(QThread):  # 線程2
    _signal =pyqtSignal()
    def __init__(self):
        super().__init__()
 
    def run(self):
        # qmut_2.lock()  # 加鎖
        values = ["a", "b", "c", "d", "e","f","g","h","i","j","k"]
        print("====     Thread_2    ====")
        for i in values:
            print("Thread_2:",i)
            time.sleep(0.5)
        # qmut_2.unlock()  # 解鎖
        self._signal.emit()
 
class Thread_3(QThread):  # 線程2
    _signal =pyqtSignal()
    def __init__(self):
        super().__init__()
 
    def run(self):
        qmut_3.lock()  # 加鎖
        values = ["a", "b", "c", "d", "e","f","g","h","i","j","k"]
        print("====     Thread_3    ====")
        for i in values:
            print("Thread_3:",i)
            time.sleep(0.5)
        qmut_3.unlock()  # 解鎖
        self._signal.emit() #執(zhí)行完畢后,釋放信號(hào)
 
class Thread_01(QThread):  # 線程1
    def __init__(self):
        super().__init__()
 
    def run(self):
        values = [1, 2, 3, 4, 5]
        print("====     Thread_01       ====")
        for i in values:
            print("Thread_01:",i)
            time.sleep(0.5)  # 休眠
 
class Thread_02(QThread):  # 線程2
    def __init__(self):
        super().__init__()
 
    def run(self):
        values = ["a", "b", "c", "d", "e"]
        print("====     Thread_02       ====")
        for i in values:
            print("Thread_02:",i)
            time.sleep(0.5)
 
 
class MyWin(QWidget):
    def __init__(self):
        super().__init__()
        # 按鈕初始化
        self.btn_01 = QPushButton('按鈕_每點(diǎn)一次運(yùn)行一次', self)
        self.btn_01.move(80, 40)
        self.btn_01.clicked.connect(self.click_01)  # 綁定槽函數(shù)
 
        self.btn_02 = QPushButton('按鈕_每點(diǎn)一次運(yùn)行一次', self)
        self.btn_02.move(80, 80)
        self.btn_02.clicked.connect(self.click_02)  # 綁定槽函數(shù)
 
        self.btn_1 = QPushButton('按鈕_線程鎖_多次點(diǎn)擊,依次執(zhí)行(滯后感)', self)
        self.btn_1.move(80, 120)
        self.btn_1.clicked.connect(self.click_1)  # 綁定槽函數(shù)
 
        self.btn_2 = QPushButton('按鈕_線程鎖_收到完成信號(hào)后才能再次點(diǎn)擊', self)
        self.btn_2.move(80, 160)
        self.btn_2.clicked.connect(self.click_2)  # 綁定槽函數(shù)
 
        self.btn_3 = QPushButton('按鈕_線程鎖_收到完成信號(hào)后再次執(zhí)行', self)
        self.btn_3.move(80, 200)
        self.btn_3.clicked.connect(self.click_3)  # 綁定槽函數(shù)
 
    def click_01(self):
        self.thread_01 = Thread_01()  # 創(chuàng)建線程
        self.thread_01.start()  # 開始線程
    def click_02(self):
        self.thread_02 = Thread_02()  # 創(chuàng)建線程
        self.thread_02.start()  # 開始線程
 
    def click_1(self):
        self.thread_1 = Thread_1()  # 創(chuàng)建線程
        self.thread_1.start()  # 開始線程
 
    def click_2(self):
        self.btn_2.setEnabled(False)
        self.thread_2 = Thread_2()
        self.thread_2._signal.connect(self.set_btn_2) #信號(hào)連接,如果收到信號(hào),就執(zhí)行對(duì)應(yīng)的函數(shù)
        self.thread_2.start()
 
    def click_3(self):
        self.btn_3.setEnabled(False)
        self.thread_3 = Thread_3()
        self.thread_3._signal.connect(self.set_btn_3) #信號(hào)連接,如果收到信號(hào),就執(zhí)行對(duì)應(yīng)的函數(shù)
        self.thread_3.start()
 
    def set_btn_2(self):
        self.btn_2.setEnabled(True)
 
    def set_btn_3(self):
        self.btn_3.setEnabled(True)
 
 
if __name__ == "__main__":
    app = QApplication(sys.argv)
    myshow = MyWin()
    myshow.setWindowTitle("多線程演示")
    myshow.setMinimumHeight(500)
    myshow.setMinimumWidth(500)
    myshow.show()
    sys.exit(app.exec_())

運(yùn)行結(jié)果

====? ? ?Thread_01? ? ? ?====

Thread_01: 1

Thread_01: 2

Thread_01: 3

Thread_01: 4

Thread_01: 5

====? ? ?Thread_02? ? ? ?====

Thread_02: a

Thread_02: b

Thread_02: c

Thread_02: d

Thread_02: e

====? ? ?Thread_1? ? ====

Thread_1: 1

Thread_1: 2

Thread_1: 3

Thread_1: 4

Thread_1: 5

Thread_1: 6

Thread_1: 7

Thread_1: 8

Thread_1: 9

====? ? ?Thread_2? ? ====

Thread_2: a

Thread_1: 10

Thread_2: b

Thread_2: c

Thread_2: d

====? ? ?Thread_3? ? ====

Thread_3: a

Thread_2: e

Thread_3: b

Thread_2: f

Thread_3: c

Thread_2: g

Thread_3: d

Thread_2: h

Thread_3: e

Thread_2: i

Thread_3: f

Thread_2: j

Thread_3: g

Thread_2: k

Thread_3: h

運(yùn)行過程

到此這篇關(guān)于Python Pyqt5多線程更新UI代碼實(shí)例(防止界面卡死)的文章就介紹到這了,更多相關(guān)Python Pyqt5多線程更新U內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 快速解決PyCharm無法引用matplotlib的問題

    快速解決PyCharm無法引用matplotlib的問題

    今天小編就為大家分享一篇快速解決PyCharm無法引用matplotlib的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • Python實(shí)現(xiàn)將目錄中TXT合并成一個(gè)大TXT文件的方法

    Python實(shí)現(xiàn)將目錄中TXT合并成一個(gè)大TXT文件的方法

    這篇文章主要介紹了Python實(shí)現(xiàn)將目錄中TXT合并成一個(gè)大TXT文件的方法,涉及Python針對(duì)目錄下文本文件的遍歷、讀取及寫入等技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • python將多個(gè)py文件和其他文件打包為exe可執(zhí)行文件

    python將多個(gè)py文件和其他文件打包為exe可執(zhí)行文件

    這篇文章主要介紹了python將多個(gè)py文件和其他文件打包為exe可執(zhí)行文件,通過準(zhǔn)備要打包的工程文件展開詳情,需要的小伙伴可以參考一下
    2022-05-05
  • Python?selenium?webdriver?基本使用代碼分享

    Python?selenium?webdriver?基本使用代碼分享

    這篇文章主要介紹了Python?selenium?webdriver?基本使用,本文僅僅簡(jiǎn)單介紹了selenium的使用常用代碼分享,需要的朋友可以參考下
    2022-11-11
  • 深入了解Python?中線程和進(jìn)程區(qū)別

    深入了解Python?中線程和進(jìn)程區(qū)別

    這篇文章主要介紹了深入了解Python?中線程和進(jìn)程區(qū)別,一個(gè)進(jìn)程由一個(gè)或者多個(gè)線程組成,線程是一個(gè)進(jìn)程中代碼的不同執(zhí)行路線。切換進(jìn)程需要的資源比切換線程的要多的多,下面來了解更多的詳細(xì)內(nèi)容,需要的小伙伴可以參考一下
    2022-03-03
  • Python類中使用cursor.execute()時(shí)語(yǔ)法錯(cuò)誤的解決方法

    Python類中使用cursor.execute()時(shí)語(yǔ)法錯(cuò)誤的解決方法

    在 Python 類中使用 cursor.execute() 時(shí),出現(xiàn)語(yǔ)法錯(cuò)誤(如 SyntaxError 或 SQL 語(yǔ)法相關(guān)錯(cuò)誤)通常是因?yàn)?nbsp;SQL 語(yǔ)句格式不正確、占位符使用不當(dāng),或參數(shù)傳遞方式不符合預(yù)期,以下是解決此類問題的常見方法和建議,需要的朋友可以參考下
    2024-09-09
  • Django之importlib模塊的具體使用

    Django之importlib模塊的具體使用

    本文主要介紹了Django之importlib模塊的具體使用,importlib模塊是Python中用于動(dòng)態(tài)加載和導(dǎo)入模塊的內(nèi)置模塊,有需要了解jquery event事件用法的朋友可參考
    2023-11-11
  • Python用類實(shí)現(xiàn)撲克牌發(fā)牌的示例代碼

    Python用類實(shí)現(xiàn)撲克牌發(fā)牌的示例代碼

    這篇文章主要介紹了Python用類實(shí)現(xiàn)撲克牌發(fā)牌的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • 詳解Python連接oracle的問題記錄與解決

    詳解Python連接oracle的問題記錄與解決

    這篇文章主要為大家詳細(xì)介紹了Python連接oracle時(shí)會(huì)出現(xiàn)的一些問題記錄與解決方法,文中的示例代碼講解詳細(xì),需要的小伙伴可以參考一下
    2023-04-04
  • python線程里哪種模塊比較適合

    python線程里哪種模塊比較適合

    在本篇文章里我們給大家整理了關(guān)于python線程里哪種模塊比較適合的相關(guān)知識(shí)點(diǎn),需要的朋友們可以學(xué)習(xí)下。
    2020-08-08

最新評(píng)論

柳州市| 会昌县| 新巴尔虎右旗| 铜梁县| 禹州市| 鄂州市| 凉城县| 榆树市| 曲周县| 阿勒泰市| 南陵县| 湘阴县| 丽水市| 礼泉县| 巴南区| 玉树县| 阿勒泰市| 峨眉山市| 泰和县| 图木舒克市| 谢通门县| 日土县| 民县| 兰考县| 新安县| 华安县| 林芝县| 普陀区| 威远县| 英德市| 平顺县| 武功县| 政和县| 福海县| 绥芬河市| 南郑县| 泌阳县| 卢湾区| 惠州市| 大荔县| 东丽区|