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

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

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

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

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

使用PyQt界面程序,點(diǎn)擊運(yùn)行按鈕后,程序在顯示框中每秒打印1個(gè)數(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_())

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

 

問題分析

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

多線程模塊QThread基本原理

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

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

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

thread = Thread()
thread.start()

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

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

QThread類中的常用方法

  start():?jiǎn)?dòng)線程

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

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

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

  sleep():強(qiáng)制當(dāng)前線程睡眠多少秒

QThread類中的常用信號(hào)

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

finished:當(dāng)程序完成業(yè)務(wù)邏輯時(shí),從相關(guān)線程發(fā)射此信號(hào)

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

先繼承QThread類并重新實(shí)現(xiàn)其中的run()函數(shù),也就是說把耗時(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)
    # 實(shí)例化線程對(duì)象
    self.work = WorkThread()
    self.runButton.clicked.connect(self.execute)

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

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

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

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

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

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

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

小結(jié)

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

附錄

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設(shè)計(jì)的界面源程序代碼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>

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python生成器的使用方法和示例代碼

    Python生成器的使用方法和示例代碼

    今天小編就為大家分享一篇關(guān)于Python生成器的使用方法和示例代碼,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Python經(jīng)典五人分魚實(shí)例講解

    Python經(jīng)典五人分魚實(shí)例講解

    在本篇文章里小編給大家分享的是一篇關(guān)于Python 五人分魚的經(jīng)典小游戲?qū)嵗齼?nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-01-01
  • Python中如何使用pypandoc進(jìn)行格式轉(zhuǎn)換操作

    Python中如何使用pypandoc進(jìn)行格式轉(zhuǎn)換操作

    這篇文章主要介紹了Python中如何使用pypandoc進(jìn)行格式轉(zhuǎn)換操作,pypandoc是一個(gè)強(qiáng)大的文檔轉(zhuǎn)換工具,它可以將各種標(biāo)記語言轉(zhuǎn)換為不同的格式,支持多種輸入和輸出格式,并允許用戶添加自定義樣式、模板和過濾器
    2021-06-06
  • 詳解MySQL數(shù)據(jù)類型int(M)中M的含義

    詳解MySQL數(shù)據(jù)類型int(M)中M的含義

    int(M)拆分來說,int是代表整型數(shù)據(jù)那,么中間的M應(yīng)該是代表多少位了,后來查mysql手冊(cè)也得知了我的理解是正確的,下面這篇文章小編就來舉例詳細(xì)說明。 文中介紹的很詳細(xì),相信對(duì)大家的理解和學(xué)習(xí)很有幫助,有需要的朋友們下面就來學(xué)習(xí)學(xué)習(xí)吧。
    2016-11-11
  • 詳解Python的Django框架中inclusion_tag的使用

    詳解Python的Django框架中inclusion_tag的使用

    這篇文章主要介紹了詳解Python的Django框架中inclusion_tag的使用,文中示例基于Python較早的2.x版本,希望能夠注意一下,需要的朋友可以參考下
    2015-07-07
  • pytest注解使用小結(jié)

    pytest注解使用小結(jié)

    本文介紹了pytest測(cè)試框架中常用的一些裝飾器,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-02-02
  • Python?生成器yield原理及用法

    Python?生成器yield原理及用法

    這篇文章主要介紹了Python?生成器yield原理及用法,yield?是實(shí)現(xiàn)生成器方法之一,當(dāng)函數(shù)使用yield方法,則該函數(shù)就成為了一個(gè)生成器,更多相關(guān)資料需要的小伙伴可以參考一下下面文章內(nèi)容
    2022-06-06
  • OpenCV2從攝像頭獲取幀并寫入視頻文件的方法

    OpenCV2從攝像頭獲取幀并寫入視頻文件的方法

    今天小編就為大家分享一篇OpenCV2從攝像頭獲取幀并寫入視頻文件的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • python如何獲取Prometheus監(jiān)控?cái)?shù)據(jù)

    python如何獲取Prometheus監(jiān)控?cái)?shù)據(jù)

    這篇文章主要介紹了python如何獲取Prometheus監(jiān)控?cái)?shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • python gui開發(fā)——制作抖音無水印視頻下載工具(附源碼)

    python gui開發(fā)——制作抖音無水印視頻下載工具(附源碼)

    這篇文章主要介紹了python gui開發(fā)——制作抖音無水印視頻下載工具(附源碼)的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-02-02

最新評(píng)論

山阴县| 珠海市| 房山区| 汤阴县| 汝阳县| 聂拉木县| 乌拉特前旗| 富锦市| 玉山县| 武穴市| 民和| 兰西县| 巴南区| 思南县| 仁怀市| 酒泉市| 沐川县| 华亭县| 临汾市| 定襄县| 普安县| 加查县| 峨边| 济宁市| 赤壁市| 南昌市| 榆社县| 仪陇县| 宿州市| 湘西| 乌海市| 金沙县| 鸡西市| 灵台县| 句容市| 弥渡县| 繁昌县| 达孜县| 临西县| 伊川县| 清镇市|