1. 程式人生 > >python3多執行緒更新UI資料,pyqt5介面重新整理

python3多執行緒更新UI資料,pyqt5介面重新整理

本程式碼執行python3,pyqt5環境下。在編寫介面程式的時候經常會執行一些耗時的操作,所以我們要使用多執行緒來做耗時任務,主執行緒用來重繪介面。而子執行緒裡邊的實時處理結果需要反饋到介面。而總所周知,子執行緒裡邊不能執行介面更新操作。

下面是我寫微信機器人的時候總結出來的,大家可以看看這段程式碼。這段程式碼缺少相應的另外一些檔案,故不能直接執行。

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

from PyQt5 import QtWidgets, QtCore
from main import Ui_MainWindow
from wechat import wechat
import sys
from PyQt5.QtCore import *
import time

# 繼承QThread
class Runthread(QtCore.QThread):
    # python3,pyqt5與之前的版本有些不一樣
    #  通過類成員物件定義訊號物件
    _signal = pyqtSignal(str)

    def __init__(self, parent=None):
        super(Runthread, self).__init__()

    def __del__(self):
        self.wait()

    def run(self):
        # 處理你要做的業務邏輯,這裡是通過一個回撥來處理資料,這裡的邏輯處理寫自己的方法
        # wechat.start_auto(self.callback)
        # self._signal.emit(msg);  可以在這裡寫訊號煥發

    def callback(self, msg):
        # 訊號煥發,我是通過我封裝類的回撥來發起的
        # self._signal.emit(msg);


class mywindow(QtWidgets.QWidget, Ui_MainWindow):
    def __init__(self):
        super(mywindow, self).__init__()
        self.setupUi(self)
        self.Button_start.clicked.connect(self.start_login)

    def start_login(self):
        # 建立執行緒
        self.thread = Runthread()
        # 連線訊號
        self.thread._signal.connect(self.callbacklog)
        # 開始執行緒
        self.thread.start()

    def callbacklog(self, msg):
        # 獎回撥資料輸出到文字框
        self.textEdit_log.setText(self.textEdit_log.toPlainText()+ "\n"+ msg+ "   "+
                                  time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()));


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

大家可以下載我這個微信機器人玩玩,基於itchat包開發。