中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PyQt5中異步刷新UI和Python多線程的示例分析

發布時間:2021-08-03 12:53:24 來源:億速云 閱讀:401 作者:小新 欄目:開發技術

這篇文章主要為大家展示了“PyQt5中異步刷新UI和Python多線程的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“PyQt5中異步刷新UI和Python多線程的示例分析”這篇文章吧。

PyQt

PyQt簡介

PyQt是Qt的python接口,PyQt的文檔較少,但接口和函數可以完全參照Qt,繼承了Qt中大量的控件以及信號機制,十分方便。以下簡介一個基本的PyQt程序。

- 需要導入的類主要來自三個包

- from PyQt5.QtWidgets import 常用的控件

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

- PyQt5.QtGui UI類,如QFont

- 基礎的程序結構:

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

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

總體來說:

1. 首先實例化APP

2. 實例化預定義控件或者自己派生自庫中的控件,記得調用show()函數

3. 執行并安全退出

Python中的多線程

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

1. 線程啟動使用start()函數

2. 如果需要等待線程執行使用join,這樣主線程會阻塞

實現方式一

直接傳入函數,啟動線程,可以傳入參數

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

實現方式二

繼承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方法會讓主線程阻塞在這里,等待子線程結束,在里面可以設置阻塞的時間

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

信號機制

QT中的信號機制能夠方便的編寫回調。

1. 很多控件都有預定的信號如clicked,直接使用clicked.connect連接槽函數即可。

2. 繼承自Qt的類,然后自定義一個signal類變量,在實例連接信號就可以了

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

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

# 槽函數
def callback():
 pass

UI刷新

在界面中,通常用會有一些按鈕,點擊后觸發事件,比如去下載一個文件或者做一些操作,這些操作會耗時,如果不能及時結束,主線程將會阻塞,這樣界面就會出現未響應的狀態,因此必須使用多線程來解決這個問題。

注意:

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

2. 但是又必須要實現子線程和主線程之間的通信,否則無法得知任務是否完成。因此使用PyQt5中的QThread,這樣既可以使用信號機制,又能夠使用多線程。

3. 當啟動多線程后,注冊信號,槽函數為主線程中的函數,當任務完成后,發射信號,在主線程中對UI進行更新。

注:由于需要注冊信號,thread需要是繼承自QThread的類

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

 def __del__(self):
  self.wait()

 def run(self):
  # 進行任務操作
  self.signal.emit() # 發射信號

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

def callbakc(self):
 pass

以上是“PyQt5中異步刷新UI和Python多線程的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

渝中区| 甘泉县| 安陆市| 日照市| 安平县| 新疆| 扬中市| 烟台市| 伊宁市| 个旧市| 石狮市| 湟源县| 安吉县| 根河市| 临沂市| 大兴区| 永靖县| 呼图壁县| 象山县| 蓬莱市| 三亚市| 咸阳市| 元氏县| 南安市| 福建省| 岢岚县| 巴青县| 九龙县| 保靖县| 浦东新区| 海晏县| 荣昌县| 宝山区| 西乌| 邹城市| 山阳县| 武山县| 汝阳县| 托里县| 胶南市| 邵阳县|