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

PyQt5 pyqt多線程操作入門

 更新時(shí)間:2018年05月05日 09:24:31   作者:翻滾吧挨踢男  
本篇文章主要介紹了PyQt5 pyqt多線程操作入門,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

首先來看一個(gè)例子:

# coding=utf-8 
__author__ = 'a359680405'  
from PyQt5.QtCore import * 
from PyQt5.QtGui import * 
from PyQt5.QtWidgets import *  
global sec 
sec=0 
def setTime(): 
  global sec 
  sec+=1 
  lcdNumber.display(sec)     #LED顯示數(shù)字+1  
def work(): 
  timer.start(1000)        #計(jì)時(shí)器每秒計(jì)數(shù) 
  for i in range(2000000000): 
    pass 
  timer.stop()  
app=QApplication([]) 
top=QWidget() 
layout=QVBoxLayout(top)       #垂直布局類QVBoxLayout; 
lcdNumber=QLCDNumber()       #加個(gè)顯示屏 
layout.addWidget(lcdNumber) 
button=QPushButton("測試") 
layout.addWidget(button)  
timer=QTimer() 
timer.timeout.connect(setTime)   #每次計(jì)時(shí)結(jié)束,觸發(fā)setTime 
button.clicked.connect(work)  
top.show() 
app.exec() 

我們的主界面有一個(gè)用于顯示時(shí)間的 LCD 數(shù)字面板還有一個(gè)用于啟動任務(wù)的按鈕。程序的目的是用戶點(diǎn)擊按鈕,開始一個(gè)非常耗時(shí)的運(yùn)算(程序中我們以一個(gè) 2000000000 次的循環(huán)來替代這個(gè)非常耗時(shí)的工作,在真實(shí)的程序中,這可能是一個(gè)網(wǎng)絡(luò)訪問,可能是需要復(fù)制一個(gè)很大的文件或者其它任務(wù)),同時(shí) LCD 開始顯示逝去的毫秒數(shù)。毫秒數(shù)通過一個(gè)計(jì)時(shí)器QTimer進(jìn)行更新。計(jì)算完成后,計(jì)時(shí)器停止。這是一個(gè)很簡單的應(yīng)用,也看不出有任何問題。但是當(dāng)我們開始運(yùn)行程序時(shí),問題就來了:點(diǎn)擊按鈕之后,程序界面直接停止響應(yīng),直到循環(huán)結(jié)束才開始重新更新,于是計(jì)時(shí)器使用顯示0。

有經(jīng)驗(yàn)的開發(fā)者立即指出,這里需要使用線程。這是因?yàn)?Qt 中所有界面都是在 UI 線程中(也被稱為主線程,就是執(zhí)行了QApplication::exec()的線程),在這個(gè)線程中執(zhí)行耗時(shí)的操作(比如那個(gè)循環(huán)),就會阻塞 UI 線程,從而讓界面停止響應(yīng)。界面停止響應(yīng),用戶體驗(yàn)自然不好,不過更嚴(yán)重的是,有些窗口管理程序會檢測到你的程序已經(jīng)失去響應(yīng),可能會建議用戶強(qiáng)制停止程序,這樣一來你的程序可能就此終止,任務(wù)再也無法完成。所以,為了避免這一問題,我們要使用 QThread 開啟一個(gè)新的線程:

# coding=utf-8 
__author__ = 'a359680405'  
from PyQt5.QtCore import * 
from PyQt5.QtGui import * 
from PyQt5.QtWidgets import *  
global sec 
sec=0 
class WorkThread(QThread): 
  trigger = pyqtSignal() 
  def __int__(self): 
    super(WorkThread,self).__init__() 
 
  def run(self): 
    for i in range(203300030): 
      pass 
    self.trigger.emit()     #循環(huán)完畢后發(fā)出信號 
 
def countTime(): 
  global sec 
  sec+=1 
  lcdNumber.display(sec)     #LED顯示數(shù)字+1 
 
def work(): 
  timer.start(1000)        #計(jì)時(shí)器每秒計(jì)數(shù) 
  workThread.start()       #計(jì)時(shí)開始 
  workThread.trigger.connect(timeStop)  #當(dāng)獲得循環(huán)完畢的信號時(shí),停止計(jì)數(shù) 
 
def timeStop(): 
  timer.stop() 
  print("運(yùn)行結(jié)束用時(shí)",lcdNumber.value()) 
  global sec 
  sec=0  
app=QApplication([]) 
top=QWidget() 
layout=QVBoxLayout(top)       #垂直布局類QVBoxLayout; 
lcdNumber=QLCDNumber()       #加個(gè)顯示屏 
layout.addWidget(lcdNumber) 
button=QPushButton("測試") 
layout.addWidget(button)  
timer=QTimer() 
workThread=WorkThread() 
button.clicked.connect(work) 
timer.timeout.connect(countTime)   #每次計(jì)時(shí)結(jié)束,觸發(fā)setTime  
top.show() 
app.exec() 

我增加了一個(gè)WorkerThread類。WorkerThread繼承自QThread類,重寫了其run()函數(shù)。可以認(rèn)為,run()函數(shù)就是新的線程需要執(zhí)行的代碼。在這里就是要執(zhí)行這個(gè)循環(huán),然后發(fā)出計(jì)算完成的信號。而在按鈕點(diǎn)擊的槽函數(shù)中,使用work()中的workThread.start()函數(shù)啟動一個(gè)線程(注意,這里不是run()函數(shù))。再次運(yùn)行程序,你會發(fā)現(xiàn)現(xiàn)在界面已經(jīng)不會被阻塞了。

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

相關(guān)文章

  • Python基于Tkinter編寫crc校驗(yàn)工具

    Python基于Tkinter編寫crc校驗(yàn)工具

    這篇文章主要介紹了Python基于Tkinter編寫crc校驗(yàn)工具,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Python中對數(shù)據(jù)庫的操作詳解

    Python中對數(shù)據(jù)庫的操作詳解

    今天簡單說說MySQL,我們存儲數(shù)據(jù),直接用本地文件即可,但是,本地文件不利于存放海量數(shù)據(jù),也不利于用程序?qū)ξ募臄?shù)據(jù)進(jìn)行查詢與管理,我們可以使用數(shù)據(jù)庫
    2023-02-02
  • 使用python進(jìn)行量化交易的完整指南

    使用python進(jìn)行量化交易的完整指南

    量化交易,作為現(xiàn)代金融市場中的一種先進(jìn)交易方式,通過運(yùn)用數(shù)學(xué)模型、統(tǒng)計(jì)方法和計(jì)算機(jī)算法來指導(dǎo)交易決策,旨在提高交易效率和決策的準(zhǔn)確性,本文將詳細(xì)介紹如何使用Python進(jìn)行量化交易,包括策略開發(fā)、數(shù)據(jù)處理、回測、風(fēng)險(xiǎn)管理和實(shí)盤交易等關(guān)鍵步驟
    2024-09-09
  • 學(xué)生如何免費(fèi)使用Pycharm專業(yè)版學(xué)生認(rèn)證教程

    學(xué)生如何免費(fèi)使用Pycharm專業(yè)版學(xué)生認(rèn)證教程

    這篇文章主要介紹了學(xué)生如何免費(fèi)使用Pycharm專業(yè)版,學(xué)生認(rèn)證教程,有了這個(gè)教程在校期間就可以免費(fèi)使用Pycharm,簡直是學(xué)生黨的福音,快來一起看看吧
    2023-03-03
  • 如何使用Python異步之上下文管理器

    如何使用Python異步之上下文管理器

    這篇文章主要為大家介紹了如何使用Python異步之上下文管理器詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Python asyncore socket客戶端實(shí)現(xiàn)方法詳解

    Python asyncore socket客戶端實(shí)現(xiàn)方法詳解

    這篇文章主要介紹了Python asyncore socket客戶端實(shí)現(xiàn)方法,asyncore庫是python的一個(gè)標(biāo)準(zhǔn)庫,提供了以異步的方式寫入套接字服務(wù)的客戶端和服務(wù)器的基礎(chǔ)結(jié)構(gòu)
    2022-12-12
  • 利用python生成照片墻的示例代碼

    利用python生成照片墻的示例代碼

    這篇文章主要介紹了利用python生成照片墻的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 詳解用python寫網(wǎng)絡(luò)爬蟲-爬取新浪微博評論

    詳解用python寫網(wǎng)絡(luò)爬蟲-爬取新浪微博評論

    這篇文章主要介紹了python爬取新浪微博評論,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • python2.7使用plotly繪制本地散點(diǎn)圖和折線圖

    python2.7使用plotly繪制本地散點(diǎn)圖和折線圖

    這篇文章主要為大家詳細(xì)介紹了python2.7使用plotly繪制本地散點(diǎn)圖和折線圖實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • Python正則表達(dá)式介紹

    Python正則表達(dá)式介紹

    本文介紹了Python對于正則表達(dá)式的支持,包括正則表達(dá)式基礎(chǔ)以及Python正則表達(dá)式標(biāo)準(zhǔn)庫的完整介紹及使用示例。本文的內(nèi)容不包括如何編寫高效的正則表達(dá)式、如何優(yōu)化正則表達(dá)式,這些主題請查看其他教程
    2012-08-08

最新評論