亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

PyQt5中多線程模塊QThread使用方法的實現(xiàn)

 更新時間:2020年01月31日 15:22:30   作者:YingHong  
這篇文章主要介紹了PyQt5中多線程模塊QThread使用方法的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

本文主要講解使用多線程模塊QThread解決PyQt界面程序唉執(zhí)行耗時操作時,程序卡頓出現(xiàn)的無響應以及界面輸出無法實時顯示的問題。用戶使用工具過程中出現(xiàn)這些問題時會誤以為程序出錯,從而把程序關閉。這樣,導致工具的用戶使用體驗不好。下面我們通過模擬上述出現(xiàn)的問題并講述使用多線程QThread模塊解決此類問題的方法。

PyQt程序卡頓和無法實時顯示問題現(xiàn)象

使用PyQt界面程序,點擊運行按鈕后,程序在顯示框中每秒打印1個數(shù)字。程序代碼如下:

# -*- coding: utf-8 -*-

import sys
import time
from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.QtWidgets import QApplication, QMainWindow
from QThread_Example_UI import Ui_Form

class MyMainForm(QMainWindow, Ui_Form):
  def __init__(self, parent=None):
    super(MyMainForm, self).__init__(parent)
    self.setupUi(self)
    self.runButton.clicked.connect(self.display)

  def display(self):
    for i in range(20):
      time.sleep(1)
      self.listWidget.addItem(str(i))

if __name__ == "__main__":
  app = QApplication(sys.argv)
  myWin = MyMainForm()
  myWin.show()
  sys.exit(app.exec_())

程序運行過程結果如下(點擊Run按鈕后界面出現(xiàn) 未響應 字樣 同時程序也沒有出現(xiàn)每隔1秒打印1個數(shù)字,實際結果是循環(huán)結束后20個數(shù)字一同展示):

 

問題分析

上述實現(xiàn)的GUI程序都是單線程運行,對于需要執(zhí)行一個特別耗時的操作時就會出現(xiàn)該問題現(xiàn)象。要解決這種問題可以考慮使用多線程模塊QThread。

多線程模塊QThread基本原理

QThread是Qt的線程類中最核心的底層類。由于PyQt的的跨平臺特性,QThread要隱藏所有與平臺相關的代碼 要使用的QThread開始一個線程,可以創(chuàng)建它的一個子類,然后覆蓋其它QThread.run()函數(shù)。

class Thread(QThread):
  def __init__(self):
    super(Thread,self).__init__()
  def run(self):
    #

接下來創(chuàng)建一個新的線程

thread = Thread()
thread.start()

可以看出,PyQt的線程使用非常簡單,建立一個自定義的類(如Thread),自我繼承自QThread ,并實現(xiàn)其run()方法即可。在使用線程時可以直接得到Thread實例,調(diào)用其start()函數(shù)即可啟動線程,線程啟動之后,會自動調(diào)用其實現(xiàn)的run()的函數(shù),該方法就是線程的執(zhí)行函數(shù) 。

業(yè)務的線程任務就寫在run()函數(shù)中,當run()退出之后線程就基本結束了,QThread有started和finished信號,可以為這兩個信號指定槽函數(shù),在線程啟動和結束之時執(zhí)行一段代碼進行資源的初始化和釋放操作,更靈活的使用方法是,在自定義的QThread實例中自定義信號,并將信號連接到指定的槽函數(shù),當滿足一定的業(yè)務條件時發(fā)射此信號。

QThread類中的常用方法

  start():啟動線程

  wait():阻止線程,直到滿足如下條件之一

(1)與此QThread對象關聯(lián)的線程已完成執(zhí)行(即從run返回時),如果線程完成執(zhí)行,此函數(shù)返回True,如果線程尚未啟動,也返回True

(2)等待時間的單位是毫秒,如果時間是ULONG_MAX(默認值·),則等待,永遠不會超時(線程必須從run返回),如果等待超時,此函數(shù)將會返回False

  sleep():強制當前線程睡眠多少秒

QThread類中的常用信號

  started: 在開始執(zhí)行run函數(shù)之前,從相關線程發(fā)射此信號

finished:當程序完成業(yè)務邏輯時,從相關線程發(fā)射此信號

使用QThread重新實現(xiàn)程序解決問題

先繼承QThread類并重新實現(xiàn)其中的run()函數(shù),也就是說把耗時的操作放入run()函數(shù)中。代碼如下:

# -*- coding: utf-8 -*-

import sys
import time
from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.QtWidgets import QApplication, QMainWindow
from QThread_Example_UI import Ui_Form

class MyMainForm(QMainWindow, Ui_Form):
  def __init__(self, parent=None):
    super(MyMainForm, self).__init__(parent)
    self.setupUi(self)
    # 實例化線程對象
    self.work = WorkThread()
    self.runButton.clicked.connect(self.execute)

  def execute(self):
    # 啟動線程
    self.work.start()
    # 線程自定義信號連接的槽函數(shù)
    self.work.trigger.connect(self.display)

  def display(self,str):
    # 由于自定義信號時自動傳遞一個字符串參數(shù),所以在這個槽函數(shù)中要接受一個參數(shù)
    self.listWidget.addItem(str)

class WorkThread(QThread):
  # 自定義信號對象。參數(shù)str就代表這個信號可以傳一個字符串
  trigger = pyqtSignal(str)

  def __int__(self):
    # 初始化函數(shù)
    super(WorkThread, self).__init__()

  def run(self):
    #重寫線程執(zhí)行的run函數(shù)
    #觸發(fā)自定義信號
    for i in range(20):
      time.sleep(1)
      # 通過自定義信號把待顯示的字符串傳遞給槽函數(shù)
      self.trigger.emit(str(i))

if __name__ == "__main__":
  app = QApplication(sys.argv)
  myWin = MyMainForm()
  myWin.show()
  sys.exit(app.exec_())

程序運行結果如下(實現(xiàn)了每隔1秒打印1個數(shù)字):

小結

如果你實現(xiàn)的工具需要執(zhí)行特別耗時的操作,可以參考使用本文多線程QThread處理方法實現(xiàn)。當然,工具實際實現(xiàn)過程中的場景會比這復雜。比如,你的輸出并不是有固定時間間隔輸出的文本框,可以嘗試使用多次self.trigger.emit(str)方法進行操作。

附錄

1、使用pyuic5轉(zhuǎn)換界面.ui程序后的QThread_Example_UI.py代碼如下:

# -*- coding: utf-8 -*-

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Form(object):
  def setupUi(self, Form):
    Form.setObjectName("Form")
    Form.resize(498, 331)
    self.runButton = QtWidgets.QPushButton(Form)
    self.runButton.setGeometry(QtCore.QRect(190, 30, 75, 23))
    self.runButton.setObjectName("runButton")
    self.listWidget = QtWidgets.QListWidget(Form)
    self.listWidget.setGeometry(QtCore.QRect(30, 70, 431, 192))
    self.listWidget.setObjectName("listWidget")

    self.retranslateUi(Form)
    QtCore.QMetaObject.connectSlotsByName(Form)

  def retranslateUi(self, Form):
    _translate = QtCore.QCoreApplication.translate
    Form.setWindowTitle(_translate("Form", "Qthread Example"))
    self.runButton.setText(_translate("Form", "Run"))

 2、Qtdesigner設計的界面源程序代碼QThread_Example_UI.ui如下:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Form</class>
 <widget class="QWidget" name="Form">
 <property name="geometry">
  <rect>
  <x>0</x>
  <y>0</y>
  <width>498</width>
  <height>331</height>
  </rect>
 </property>
 <property name="windowTitle">
  <string>Qthread Example</string>
 </property>
 <widget class="QPushButton" name="runButton">
  <property name="geometry">
  <rect>
   <x>190</x>
   <y>30</y>
   <width>75</width>
   <height>23</height>
  </rect>
  </property>
  <property name="text">
  <string>Run</string>
  </property>
 </widget>
 <widget class="QListWidget" name="listWidget">
  <property name="geometry">
  <rect>
   <x>30</x>
   <y>70</y>
   <width>431</width>
   <height>192</height>
  </rect>
  </property>
 </widget>
 </widget>
 <resources/>
 <connections/>
</ui>

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Python算法之求n個節(jié)點不同二叉樹個數(shù)

    Python算法之求n個節(jié)點不同二叉樹個數(shù)

    本文先向大家分享了建立二叉樹的簡單代碼,其次介紹了Python計算n個節(jié)點不同二叉樹個數(shù)的問題及實現(xiàn)代碼示例,具有一定參考價值,需要的朋友可以了解下。
    2017-10-10
  • 2023年最新版Python?3.12.0安裝使用指南(推薦!)

    2023年最新版Python?3.12.0安裝使用指南(推薦!)

    這篇文章主要給大家介紹了關于2023年最新版Python?3.12.0安裝使用的相關資料,Python?現(xiàn)在是非常流行的編程語言,當然并不是說Python語言性能多么強大,而是Python使用非常方便,特別是現(xiàn)在AI和大數(shù)據(jù)非常流行,用?Python?實現(xiàn)是非常容易的,需要的朋友可以參考下
    2023-10-10
  • 如何在python中執(zhí)行另一個py文件

    如何在python中執(zhí)行另一個py文件

    這篇文章主要介紹了如何在python中執(zhí)行另一個py文件,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • 利用python檢測文本相似性的三種方法

    利用python檢測文本相似性的三種方法

    文本查重,也稱為文本去重,是一項旨在識別文本文檔之間的相似性或重復性的技術或任務,它的主要目標是確定一個文本文檔是否包含與其他文檔相似或重復的內(nèi)容,本文給大家介紹了利用python檢測文本相似性的原理和方法,需要的朋友可以參考下
    2023-11-11
  • 通過Python腳本+Jenkins實現(xiàn)項目重啟

    通過Python腳本+Jenkins實現(xiàn)項目重啟

    Jenkins是一個流行的開源自動化服務器,用于快速構建、測試和部署軟件,本文主要介紹了通過Python腳本+Jenkins實現(xiàn)項目重啟,具有一定的參考價值,感興趣的可以了解一下
    2023-10-10
  • Python 安裝 virturalenv 虛擬環(huán)境的教程詳解

    Python 安裝 virturalenv 虛擬環(huán)境的教程詳解

    這篇文章主要介紹了Python 安裝 virturalenv 虛擬環(huán)境的教程,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • python中append函數(shù)用法講解

    python中append函數(shù)用法講解

    在本篇文章里小編給大家整理的是一篇關于python中append函數(shù)用法講解內(nèi)容,有興趣的朋友們可以學習下。
    2020-12-12
  • django3.02模板中的超鏈接配置實例代碼

    django3.02模板中的超鏈接配置實例代碼

    在本篇文章里小編給大家整理了關于django3.02模板中的超鏈接配置實例代碼內(nèi)容,需要的朋友們可以學習參考下。
    2020-02-02
  • Python?tkinter中l(wèi)abel控件動態(tài)改變值問題

    Python?tkinter中l(wèi)abel控件動態(tài)改變值問題

    這篇文章主要介紹了Python?tkinter中l(wèi)abel控件動態(tài)改變值問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Python 如何將字符串每兩個用空格隔開

    Python 如何將字符串每兩個用空格隔開

    這篇文章主要介紹了Python Python 如何將字符串每兩個用空格隔開的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04

最新評論