国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

PyQt5 多線程和異步刷新UI

這篇具有很好參考價(jià)值的文章主要介紹了PyQt5 多線程和異步刷新UI。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一、基礎(chǔ)程序

以下簡(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):
import sys
from PyQt5.QtWidgets import QApplication, QWidget
class Example(QWidget):
    def __init__(self):
        super().__init__()
        self.setupUI()
 
    def setupUI(self):
        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_())

二、Thread

方式一

//直接傳入函數(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()

方式二

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ī)制能夠方便的編寫(xiě)回調(diào)。

  1. 很多控件都有預(yù)定的信號(hào)如clicked,直接使用clicked.connect連接槽函數(shù)即可。
  2. 繼承自Qt的類,然后自定義一個(gè)signal類變量,在實(shí)例連接信號(hào)就可以了
class Example(QWidget):
    signal = pyqtSignal()    # 括號(hào)里填寫(xiě)信號(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)行更新。
class Example(QThread):
    signal = pyqtSignal()    # 括號(hào)里填寫(xiě)信號(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

五、moveToThread異步刷新UI

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

from PyQt5 import QtWidgets, QtCore
from PyQt5.QtCore import pyqtSignal, QObject, QThread
from QtUi import Ui_MainWindow
import sys
import time


class Work(QObject):
    count = int(0)
    count_signal = pyqtSignal(int)

    def __init__(self):
        super(Work, self).__init__()
        self.run = True

    def work(self):
        self.run = True
        while self.run:
            print(str(self.count))
            self.count += 1
            self.count_signal.emit(self.count)
            time.sleep(1)

    def work_stop(self):
        self.run = False


class MyWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(MyWindow, self).__init__()
        self.setupUi(self)
        self.pushButton_Start.clicked.connect(self.workStart)
        self.pushButton_Stop.clicked.connect(self.workStop)

        self.thread = QThread()
        self.worker = Work()
        self.worker.count_signal.connect(self.flush)

        self.worker.moveToThread(self.thread)
        self.thread.started.connect(self.worker.work)
        self.thread.finished.connect(self.finished)

    def flush(self, count):
        self.label.setText(str(count))

    def workStart(self):
        print('button start.')
        self.pushButton_Start.setEnabled(False)
        self.thread.start()

    def workStop(self):
        print('button stop.')
        self.worker.work_stop()
        self.thread.quit()

    def finished(self):
        print('finish.')
        self.pushButton_Start.setEnabled(True)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    myshow = MyWindow()
    myshow.show()
    sys.exit(app.exec_())

QtUi.py文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-666672.html

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

# Form implementation generated from reading ui file 'QtUi.ui'
#
# Created by: PyQt5 UI code generator 5.11.3
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(515, 208)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton_Start = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_Start.setGeometry(QtCore.QRect(280, 150, 92, 28))
        self.pushButton_Start.setObjectName("pushButton_Start")
        self.pushButton_Stop = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_Stop.setGeometry(QtCore.QRect(390, 150, 92, 28))
        self.pushButton_Stop.setObjectName("pushButton_Stop")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(60, 50, 381, 41))
        font = QtGui.QFont()
        font.setFamily("Adobe Arabic")
        font.setPointSize(28)
        self.label.setFont(font)
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

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

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton_Start.setText(_translate("MainWindow", "開(kāi)始"))
        self.pushButton_Stop.setText(_translate("MainWindow", "停止"))
        self.label.setText(_translate("MainWindow", "0"))

到了這里,關(guān)于PyQt5 多線程和異步刷新UI的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • pyqt5超詳細(xì)多進(jìn)程界面設(shè)計(jì)及打包流程(UI框架建構(gòu)、多線程打包、.ui.qrc文件的轉(zhuǎn).py)

    pyqt5超詳細(xì)多進(jìn)程界面設(shè)計(jì)及打包流程(UI框架建構(gòu)、多線程打包、.ui.qrc文件的轉(zhuǎn).py)

    項(xiàng)目的目標(biāo)是制作一個(gè)目標(biāo)檢測(cè)的UI界面,實(shí)現(xiàn)各類目標(biāo)的實(shí)時(shí)檢測(cè)。在制作的過(guò)程中真的遇到了數(shù)不清的坑,坑死人了。我自己梳理一下方便下次做項(xiàng)目還掉坑里,順便給大伙避避坑,當(dāng)然每個(gè)人遇到的情況不同,如果我遇到的問(wèn)題恰好幫助你解決問(wèn)題了那就太好啦。 在終

    2024年02月04日
    瀏覽(17)
  • pyqt5 如何終止正在執(zhí)行的線程?

    在 PyQt5 中終止正在執(zhí)行的線程,可以通過(guò)一些協(xié)調(diào)的方法來(lái)實(shí)現(xiàn)。一般情況下,直接強(qiáng)行終止線程是不安全的,可能會(huì)導(dǎo)致資源泄漏或者程序異常。相反,我們可以使用一種協(xié)作的方式,通知線程在合適的時(shí)候自行退出。 以下是一種常見(jiàn)的方法,使用標(biāo)志位來(lái)通知線程停止

    2024年02月14日
    瀏覽(26)
  • PyQt5多線程的執(zhí)行和停止

    PyQt5多線程的執(zhí)行和停止

    參考資料:?jiǎn)袅▎袅?pyqt5 thread多線程示例 以下代碼來(lái)自該視頻,我自己手動(dòng)實(shí)現(xiàn)了一下,當(dāng)作一個(gè)模板來(lái)學(xué)習(xí),歡迎大家一起學(xué)習(xí)。 運(yùn)行示例 三個(gè)進(jìn)程同時(shí)執(zhí)行,并且可以單獨(dú)控制暫停和繼續(xù)執(zhí)行。 以下給出運(yùn)行代碼: 完整程序參考:PyQt5 多線程執(zhí)行和停止示例

    2024年02月16日
    瀏覽(20)
  • 【PyQT5教程】-02-UI組件

    【PyQT5教程】-02-UI組件

    QtWidgets 模塊提供了多種按鈕類,讓你可以輕松地創(chuàng)建各種類型的按鈕 QPushButton 是PyQt5中最常見(jiàn)的按鈕類型之一,用于觸發(fā)動(dòng)作或執(zhí)行操作。通過(guò)信號(hào)與槽機(jī)制,你可以將按鈕的點(diǎn)擊事件與特定的函數(shù)或操作關(guān)聯(lián)起來(lái)。 QRadioButton 用于在一組選項(xiàng)中進(jìn)行單選,用戶只能選擇其中

    2024年02月09日
    瀏覽(66)
  • PyQt5學(xué)習(xí)筆記--多線程處理、數(shù)據(jù)交互

    PyQt5學(xué)習(xí)筆記--多線程處理、數(shù)據(jù)交互

    目錄 1--引入多線程的原因 2--PyQt多線程的基本知識(shí) 3--多線程登錄程序的實(shí)例 4--參考 ① 如果Qt只采用單線程任務(wù)的方式,當(dāng)遇到數(shù)據(jù)處理慢的情形時(shí),會(huì)出現(xiàn)GUI卡死的情況。 ② 使用下述例子展示單線程任務(wù)的缺陷: ③ 代碼: ④ 結(jié)果展示: 當(dāng)點(diǎn)擊第一個(gè)button時(shí),GUI會(huì)出現(xiàn)卡

    2023年04月16日
    瀏覽(28)
  • pyqt5中.ui轉(zhuǎn)為.py

    在PyQt中,可以使用Qt Designer創(chuàng)建GUI的圖形界面,設(shè)計(jì)完成后可以將其保存為.ui文件。但是,這種文件不能直接用于Python代碼編程,必須將其轉(zhuǎn)換為Python腳本,才能在Python程序中使用該界面。 將.ui文件轉(zhuǎn)換為.py文件可以讓您的程序更加靈活和方便,因?yàn)?py文件中包含了用于構(gòu)建

    2024年02月04日
    瀏覽(22)
  • Pyqt5繼承被覆蓋的Ui界面類

    Pyqt5繼承被覆蓋的Ui界面類

    提示:文章寫(xiě)完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔 文章目錄 前言 一、現(xiàn)象描述? 二、使用步驟 1.生成界面類Py文件,獲取到生成的Ui界面類 2.新建一個(gè)py文件,繼承Ui界面類 總結(jié) 提示:這里可以添加本文要記錄的大概內(nèi)容: PyQt使用designer每次設(shè)計(jì)Ui或者

    2024年02月03日
    瀏覽(28)
  • PYQT5 ui轉(zhuǎn)py后的調(diào)用

    PYQT5 ui轉(zhuǎn)py后的調(diào)用

    將程序按文件夾分好類,檢查時(shí)更加清晰如先建立resource文件夾,內(nèi)部含images(存放圖片)、UI(存放UI文件),resource文件夾與main等設(shè)計(jì)界面程序并列,ui轉(zhuǎn)成py時(shí)放在resource文件夾下邊。 ?login_pane.py(將轉(zhuǎn)換好的login.py引用,在此處對(duì)界面進(jìn)行設(shè)計(jì)) 將做好的界面類引到主界面

    2024年02月06日
    瀏覽(25)
  • Python - PyQT5開(kāi)發(fā)UI界面 - 環(huán)境搭建

    Python - PyQT5開(kāi)發(fā)UI界面 - 環(huán)境搭建

    沒(méi)有做過(guò)UI界面的都會(huì)把UI的制作想象的很神秘,我在剛開(kāi)始的時(shí)候也是感覺(jué)異常神秘、很復(fù)雜、并且無(wú)從下手,不過(guò)在真正的做出來(lái)一個(gè)界面后,發(fā)現(xiàn)也并沒(méi)有想象中的那么難,而且做出來(lái)可視化的東西所帶來(lái)的成就感是超越代碼本身的;不過(guò)整個(gè)過(guò)程也并不順利,網(wǎng)上都是

    2023年04月23日
    瀏覽(28)
  • Python - PyQT5 - ui文件轉(zhuǎn)為py文件

    Python - PyQT5 - ui文件轉(zhuǎn)為py文件

    在QTdesigner圖形化編輯工具中,有些控件我們是可以直接在編輯界面進(jìn)行編輯的,有些是不可以編輯的,只能通過(guò)Python代碼進(jìn)行編輯,不過(guò)總體來(lái)說(shuō),所有能夠通過(guò)圖形化編輯界面可以編輯的,都可以通過(guò)Python語(yǔ)言實(shí)現(xiàn)控制,這點(diǎn)是毋庸置疑的,不過(guò)為了更加美觀及降級(jí)軟件開(kāi)

    2024年02月05日
    瀏覽(18)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包