本代码运行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包开发。