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

淺談PyQt5中異步刷新UI和Python多線程總結(jié)

 更新時(shí)間:2019年12月13日 15:05:52   作者:新安淺灘  
今天小編就為大家分享一篇淺談PyQt5中異步刷新UI和Python多線程總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

目前任務(wù)需要做一個(gè)界面程序,PyQt是非常方便的選擇,QT豐富的控件以及python方便的編程。近期遇到界面中執(zhí)行一些后臺(tái)任務(wù)時(shí)界面卡死的情況,解決了在這里記錄下。

PyQt

PyQt簡(jiǎn)介

PyQt是Qt的python接口,PyQt的文檔較少,但接口和函數(shù)可以完全參照Qt,繼承了Qt中大量的控件以及信號(hào)機(jī)制,十分方便。以下簡(jiǎn)介一個(gè)基本的PyQt程序。

- 需要導(dǎo)入的類主要來(lái)自三個(gè)包

- from PyQt5.QtWidgets import 常用的控件

- PyQt5.QtCore 核心功能類,如QT,QThread,pyqtSignal

- PyQt5.QtGui UI類,如QFont

- 基礎(chǔ)的程序結(jié)構(gòu):

class Example(QWidget):
 def __init__(self):
  super()__init__()
  self.setupUI()

 def setupUI():
  self.show()
  pass
  # 設(shè)置UI
if __name__ == '__main__':
 app = QApplication(sys.argv) # 啟動(dòng)app
 ex = Example() # 實(shí)例化一個(gè)自己派生的
 # 也可以實(shí)例化庫(kù)中的控件
 # q = QPushButton()
 # q.show()
 sys.exit(app.exec_())

總體來(lái)說(shuō):

1. 首先實(shí)例化APP

2. 實(shí)例化預(yù)定義控件或者自己派生自庫(kù)中的控件,記得調(diào)用show()函數(shù)

3. 執(zhí)行并安全退出

Python中的多線程

python中的多線程使用較為方便,主要使用threading.Thread類:

1. 線程啟動(dòng)使用start()函數(shù)

2. 如果需要等待線程執(zhí)行使用join,這樣主線程會(huì)阻塞

實(shí)現(xiàn)方式一

直接傳入函數(shù),啟動(dòng)線程,可以傳入?yún)?shù)

import time, threading
def threadFunction():
 while True:
  print(11111)
  time.sleep()
# 用于命名,可以通過(guò)threading.current_thread().name獲得
t = threading.Thread(target=threadFunction, name='funciton')
# 如果線程有參數(shù)
t = threading.Thread(target=threadFunction, args=(), name='funciton')
t.start()

實(shí)現(xiàn)方式二

繼承Thread,重寫run方法

from threading import Thread
import time

class Example(Thread):
 def __init__(self):
  super().__init__()

 def run(self):
  while True:
   time.sleep(1)
   print(11111111)

if __name__ == '__main__':
 a = Example()
 a.start()
 a.join()
 print(222222222)

注意:

1. 使用join方法會(huì)讓主線程阻塞在這里,等待子線程結(jié)束,在里面可以設(shè)置阻塞的時(shí)間

2. a.setDaemon(True)在start前設(shè)置,可以保證在主線程終止時(shí),子線程也終止

信號(hào)機(jī)制

QT中的信號(hào)機(jī)制能夠方便的編寫回調(diào)。

1. 很多控件都有預(yù)定的信號(hào)如clicked,直接使用clicked.connect連接槽函數(shù)即可。

2. 繼承自Qt的類,然后自定義一個(gè)signal類變量,在實(shí)例連接信號(hào)就可以了

class Example(QWidget):
 signal = pyqtSignal() # 括號(hào)里填寫信號(hào)傳遞的參數(shù)
 # 發(fā)射信號(hào)
 def func(self):
  self.signal.emit()

# 使用信號(hào)
a = Example()
a.signal.connect(callback)

# 槽函數(shù)
def callback():
 pass

UI刷新

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

注意:

1. PyQt5不能在子線程中刷新線程,這樣會(huì)造成界面卡死,因此不能使用常規(guī)的多線程刷新UI。

2. 但是又必須要實(shí)現(xiàn)子線程和主線程之間的通信,否則無(wú)法得知任務(wù)是否完成。因此使用PyQt5中的QThread,這樣既可以使用信號(hào)機(jī)制,又能夠使用多線程。

3. 當(dāng)啟動(dòng)多線程后,注冊(cè)信號(hào),槽函數(shù)為主線程中的函數(shù),當(dāng)任務(wù)完成后,發(fā)射信號(hào),在主線程中對(duì)UI進(jìn)行更新。

注:由于需要注冊(cè)信號(hào),thread需要是繼承自QThread的類

class Example(QThread):
 signal = pyqtSignal() # 括號(hào)里填寫信號(hào)傳遞的參數(shù)
 def __init__(self):
  super().__init__()

 def __del__(self):
  self.wait()

 def run(self):
  # 進(jìn)行任務(wù)操作
  self.signal.emit() # 發(fā)射信號(hào)

# UI類中
def buttonClick(self)
 self.thread = Example()
 self.thread.signal.connect(self.callback)
 self.thread.start() # 啟動(dòng)線程

def callbakc(self):
 pass

如有錯(cuò)誤,歡迎指正~

以上這篇淺談PyQt5中異步刷新UI和Python多線程總結(jié)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python實(shí)現(xiàn)登陸文件驗(yàn)證方法

    Python實(shí)現(xiàn)登陸文件驗(yàn)證方法

    本篇文章中我們給大家分享了關(guān)于Python實(shí)現(xiàn)登陸文件驗(yàn)證的方法和技巧,有興趣的朋友們參考學(xué)習(xí)下。
    2018-10-10
  • Python多進(jìn)程寫入同一文件的方法

    Python多進(jìn)程寫入同一文件的方法

    今天小編就為大家分享一篇Python多進(jìn)程寫入同一文件的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • Python操作MySQL MongoDB Oracle三大數(shù)據(jù)庫(kù)深入對(duì)比

    Python操作MySQL MongoDB Oracle三大數(shù)據(jù)庫(kù)深入對(duì)比

    對(duì)于數(shù)據(jù)分析師來(lái)說(shuō),學(xué)習(xí)數(shù)據(jù)庫(kù)最重要的就是學(xué)習(xí)它們的查詢功能。這篇文章就以這個(gè)為切入點(diǎn),為大家講述如何用Python操作這3個(gè)數(shù)據(jù)庫(kù)
    2021-10-10
  • python實(shí)現(xiàn)b站直播自動(dòng)發(fā)送彈幕功能

    python實(shí)現(xiàn)b站直播自動(dòng)發(fā)送彈幕功能

    這篇文章主要介紹了python如何實(shí)現(xiàn)b站直播自動(dòng)發(fā)送彈幕,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-02-02
  • Python實(shí)現(xiàn)隨機(jī)分層抽樣的示例詳解

    Python實(shí)現(xiàn)隨機(jī)分層抽樣的示例詳解

    在數(shù)據(jù)分析與機(jī)器學(xué)習(xí)的實(shí)踐中,抽樣是不可或缺的一步,分層抽樣作為一種常用的抽樣方法,能夠確保樣本在不同類別中的比例與總體一致,下面我們看看如何使用Python實(shí)現(xiàn)隨機(jī)分層抽樣吧
    2024-11-11
  • selenium XPath定位的實(shí)現(xiàn)示例

    selenium XPath定位的實(shí)現(xiàn)示例

    XPath是一種在XML文檔中定位和選擇節(jié)點(diǎn)的語(yǔ)言,通過(guò)路徑表達(dá)式遍歷XML樹(shù),支持節(jié)點(diǎn)選取、字符串匹配、數(shù)值計(jì)算、邏輯運(yùn)算等功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-10-10
  • Pandas數(shù)據(jù)類型轉(zhuǎn)換df.astype()及數(shù)據(jù)類型查看df.dtypes的使用

    Pandas數(shù)據(jù)類型轉(zhuǎn)換df.astype()及數(shù)據(jù)類型查看df.dtypes的使用

    Python,numpy都有自己的一套數(shù)據(jù)格式,本文主要介紹了Pandas數(shù)據(jù)類型轉(zhuǎn)換df.astype()及數(shù)據(jù)類型查看df.dtypes的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 基于Python實(shí)現(xiàn)剪切板實(shí)時(shí)監(jiān)控方法解析

    基于Python實(shí)現(xiàn)剪切板實(shí)時(shí)監(jiān)控方法解析

    這篇文章主要介紹了基于Python實(shí)現(xiàn)剪切板實(shí)時(shí)監(jiān)控方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • python網(wǎng)絡(luò)爬蟲(chóng) Scrapy中selenium用法詳解

    python網(wǎng)絡(luò)爬蟲(chóng) Scrapy中selenium用法詳解

    這篇文章主要介紹了python網(wǎng)絡(luò)爬蟲(chóng) Scrapy中selenium用法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值
    2019-09-09
  • python驗(yàn)證公網(wǎng)ip與內(nèi)網(wǎng)ip的實(shí)現(xiàn)示例

    python驗(yàn)證公網(wǎng)ip與內(nèi)網(wǎng)ip的實(shí)現(xiàn)示例

    本文主要介紹了python驗(yàn)證公網(wǎng)ip與內(nèi)網(wǎng)ip的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07

最新評(píng)論

新蔡县| 沈阳市| 金阳县| 丰城市| 英德市| 江阴市| 无锡市| 青龙| 郓城县| 汉阴县| 申扎县| 濮阳市| 三台县| 商南县| 米易县| 马关县| 永丰县| 竹北市| 石泉县| 文成县| 绥德县| 曲阜市| 长岭县| 富民县| 平湖市| 石阡县| 大连市| 耒阳市| 阜康市| 犍为县| 呼伦贝尔市| 乐亭县| 平舆县| 台东县| 浦县| 洞口县| 富宁县| 手机| 肥东县| 平谷区| 肇东市|