欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python?PyQt5?開(kāi)啟線程防止界面卡死閃退問(wèn)題解決

 更新時(shí)間:2023年06月21日 14:41:14   投稿:mrr  
這篇文章主要介紹了Python?PyQt5?開(kāi)啟線程避免界面卡死閃退,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

Python PyQt5 的界面是主線程執(zhí)行的,如果主線程執(zhí)行了耗時(shí)操作,會(huì)導(dǎo)致主線程阻塞使得界面卡死閃退。所以,對(duì)于一個(gè)耗時(shí)操作需要開(kāi)啟一個(gè)線程執(zhí)行。

首先導(dǎo)入幾個(gè)包:

from PyQt5 import QtCore
from PyQt5.QtCore import *

創(chuàng)建一個(gè)線程類:

class ListDevicesThread(QtCore.QThread):
    signal = pyqtSignal(dict, name='list_devices')
    def run(self):
        while True:
            devices_list = apis.list_devices()
            self.signal.emit(devices_list)
            time.sleep(5)

這個(gè)線程每隔 5 秒執(zhí)行一次獲取數(shù)據(jù)的操作。并通過(guò) emit 把數(shù)據(jù)發(fā)送到主界面中。所以,主界面要獲取這個(gè)值就需要通過(guò)回調(diào)函數(shù)接收:

class Window(QWidget, Ui_Form):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        # 獲取設(shè)備列表
        self.list_shadow_thread = ListDevicesThread()
        self.list_shadow_thread.signal.connect(self.after_list_devices)
        self.list_shadow_thread.start()
  • 創(chuàng)建 ListDevicesThread 線程對(duì)象,將對(duì)象設(shè)置到類成員變量中(如果不設(shè)置,或者設(shè)置重復(fù)的線程變量名,要么讓線程無(wú)法執(zhí)行,要么主界面卡死,不能運(yùn)行程序)。
  • self.list_shadow_thread.signal.connect(self.after_list_devices) 這個(gè)代碼的意思是,得到線程對(duì)象的信號(hào)對(duì)象,連接到主界面的 after_list_devices 函數(shù),這個(gè)函數(shù)就是回調(diào)函數(shù),可以接收到 emit 函數(shù)發(fā)送過(guò)來(lái)的數(shù)據(jù),數(shù)據(jù)類型在線程中定義(可以是 str、dict 等合法的 py 類型)。
  • 第三步就是開(kāi)啟線程并執(zhí)行。

在線程獲取到一次數(shù)據(jù)之后,執(zhí)行下面的回調(diào)函數(shù),回調(diào)函數(shù)收到數(shù)據(jù) data,可以進(jìn)行一些不需要耗時(shí)的操作,如果之后還有耗時(shí)的操作建議一次性在線程執(zhí)行完成再到這個(gè)回調(diào)函數(shù)中來(lái):

def after_list_devices(self, data):
        row = 0
        self.tableWidget.setRowCount(data['page']['count'])
        for item in data['devices']:
            self.setTableItem(row, 0, item['device_id'])
            self.setTableItem(row, 1, item['device_name'])
            self.setTableItem(row, 2, item['product_name'])
            self.setTableItem(row, 3, item['status'])
            self.setTableItem(row, 4, item['description'])
            row += 1

到目前為止,上面都是線程執(zhí)行完成之后獲取數(shù)據(jù)發(fā)送給主線程(主界面),是 線程->主線程 的過(guò)程。有時(shí)候,主線程的一些輸入框里面的值需要發(fā)送給線程,讓線程得到輸入框內(nèi)的值再執(zhí)行下一步操作。這個(gè)是 主線程->線程->主線程 的過(guò)程。

首先,在線程中創(chuàng)建一個(gè)設(shè)置值的函數(shù),如 set_xxx 這樣的格式:

class QueryDeviceThread(QtCore.QThread):
    signal = pyqtSignal(dict, name='query_device')
    device_id = ''
    def set_device_id(self, device_id):
        self.device_id = device_id
    def run(self):
        device = apis.query_device(self.device_id)
        self.signal.emit(device)

device_id 是線程的類成員變量,通過(guò) set_device_id 函數(shù)給 device_id 設(shè)置新的值。在 run 函數(shù)執(zhí)行的時(shí)候,獲取到 device_id 值,這個(gè)值要在主界面開(kāi)啟線程之前設(shè)置好。

點(diǎn)擊界面的按鈕之后觸發(fā)下面的函數(shù),在開(kāi)啟線程之前,且線程對(duì)象創(chuàng)建之后,設(shè)置線程的類成員變量。

def query_device(self):
    self.query_device_thread = QueryDeviceThread()
    self.query_device_thread.set_device_id(self.input_query_device_id.text())
    self.query_device_thread.signal.connect(self.after_query_device)
    self.query_device_thread.start()

到此這篇關(guān)于Python PyQt5 開(kāi)啟線程避免界面卡死閃退的文章就介紹到這了,更多相關(guān)Python PyQt5 開(kāi)啟線程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于django2.2連oracle11g解決版本沖突的問(wèn)題

    基于django2.2連oracle11g解決版本沖突的問(wèn)題

    這篇文章主要介紹了基于django2.2連oracle11g解決版本沖突的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-07-07
  • pyqt5 實(shí)現(xiàn)在別的窗口彈出進(jìn)度條

    pyqt5 實(shí)現(xiàn)在別的窗口彈出進(jìn)度條

    今天小編就為大家分享一篇pyqt5 實(shí)現(xiàn)在別的窗口彈出進(jìn)度條,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-06-06
  • Python如何讀取base64圖片數(shù)據(jù)

    Python如何讀取base64圖片數(shù)據(jù)

    在Python中,使用base64模塊可以解碼Base64編碼的圖片數(shù)據(jù),首先需要去除Base64字符串的前綴,然后使用base64.b64decode()函數(shù)進(jìn)行解碼,最后將解碼后的數(shù)據(jù)保存為圖片文件,適用于各種MIME類型的Base64編碼
    2024-09-09
  • 在PyCharm的 Terminal(終端)切換Python版本的方法

    在PyCharm的 Terminal(終端)切換Python版本的方法

    這篇文章主要介紹了在PyCharm的 Terminal(終端)切換Python版本的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • python模塊中判斷全局變量的賦值的實(shí)例講解

    python模塊中判斷全局變量的賦值的實(shí)例講解

    在本篇文章里小編給大家整理的是一篇關(guān)于python模塊中判斷全局變量的賦值的實(shí)例講解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-03-03
  • Python 3.8 新功能全解

    Python 3.8 新功能全解

    這篇文章主要介紹了Python 3.8 新功能全解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Python center()函數(shù)使用方法詳解

    Python center()函數(shù)使用方法詳解

    在python中,center()返回一個(gè)原字符居中,并默認(rèn)使用空格填充至長(zhǎng)度width返回新字符串,默認(rèn)填充字符為空格,本就將通過(guò)代碼示例給大家簡(jiǎn)單的介紹一下Python center()函數(shù)是的使用方法,感興趣的同學(xué)跟著小編一起來(lái)看看吧
    2023-07-07
  • Python實(shí)現(xiàn)極限車神游戲的示例代碼

    Python實(shí)現(xiàn)極限車神游戲的示例代碼

    今天小編要為大家介紹一款小編自己用Python代碼碼出來(lái)的賽車風(fēng)格的打字小游戲,不僅能游戲還能學(xué)到很多不同類型的編程代碼關(guān)鍵字的語(yǔ)言,需要的可以參考一下
    2023-02-02
  • 基于K-Means聚類算法演示及可視化展示

    基于K-Means聚類算法演示及可視化展示

    這篇文章主要介紹了基于K-Means聚類算法演示及可視化展示,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Python使用tkinter實(shí)現(xiàn)小時(shí)鐘效果

    Python使用tkinter實(shí)現(xiàn)小時(shí)鐘效果

    這篇文章主要為大家詳細(xì)介紹了Python使用tkinter實(shí)現(xiàn)小時(shí)鐘效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-02-02

最新評(píng)論