Qt小组件 - 6 异步运行函数

WorkerThread异步运行自定义函数线程。若使用QThreadPool用来加载一些简单的函数还可以(例: 加载图片等),但是如果做http请求就不好做进程监控,事件提交

python 复制代码
# coding: utf-8
import sys

import requests
from PySide6.QtCore import QCoreApplication
from PySide6.QtCore import QThread, Signal


class WorkerThread(QThread):
    result = Signal(object)  # 返回结果信息信号
    failed = Signal(object)  # 返回失败信息信号
    messageSignal = Signal(object)  # 返回提示信息信号

    def __init__(self, parent=None):
        super().__init__(parent)
        self.func = None
        self.args = None
        self.kwargs = None

    def setTask(self, func, *args, **kwargs):
        self.func = func
        self.args = args
        self.kwargs = kwargs
        if not self.isRunning():
            self.start()

    def run(self):
        try:
            result = self.func(*self.args, **self.kwargs, messageSignal=self.messageSignal)
            self.result.emit(result)
        except Exception as e:
            self.failed.emit(e)


def post_baidu(messageSignal:Signal):
    messageSignal.emit('正在访问百度')
    response = requests.get('https://www.baidu.com')
    messageSignal.emit('访问百度成功')
    messageSignal.emit('判断百度是否正常')
    response.raise_for_status()
    messageSignal.emit('设置返回内容编码')
    response.encoding = 'utf-8'
    messageSignal.emit('返回百度首页内容')
    return response.text


if __name__ == '__main__':
    app = QCoreApplication(sys.argv)
    worker = WorkerThread()
    worker.started.connect(lambda: print('thread start'))
    worker.result.connect(lambda result: print(result))
    worker.failed.connect(lambda e: print(e))
    worker.messageSignal.connect(lambda message: print(message))
    worker.finished.connect(lambda: (app.quit(), print('thread finished')))
    worker.setTask(post_baidu)
    sys.exit(app.exec())

结果

python 复制代码
thread start
正在访问百度
访问百度成功
判断百度是否正常
设置返回内容编码
返回百度首页内容
<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus=autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=百度一下 class="bg s_btn" autofocus></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>新闻</a> <a href=https://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>地图</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>视频</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>贴吧</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&amp;tpl=mn&amp;u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>登录</a> </noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">登录</a>');
                </script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">更多产品</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>关于百度</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>&copy;2017&nbsp;Baidu&nbsp;<a href=http://www.baidu.com/duty/>使用百度前必读</a>&nbsp; <a href=http://jianyi.baidu.com/ class=cp-feedback>意见反馈</a>&nbsp;京ICP证030173号&nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>

thread finished
相关推荐
m0_462605225 分钟前
第N9周:seq2seq翻译实战-Pytorch复现-小白版
人工智能·pytorch·python
纪伊路上盛名在5 分钟前
记1次BioPython Entrez模块Elink的debug
前端·数据库·python·debug·工具开发
CryptoRzz6 分钟前
日本股票 API 对接实战指南(实时行情与 IPO 专题)
java·开发语言·python·区块链·maven
ss2736 分钟前
考研加油上岸祝福弹窗程序
python
yugi9878387 分钟前
基于M序列的直扩信号扩频码生成方法及周期长码直扩信号的MATLAB实现方案
开发语言·matlab
乾元14 分钟前
基于时序数据的异常预测——短期容量与拥塞的提前感知
运维·开发语言·网络·人工智能·python·自动化·运维开发
江上清风山间明月15 分钟前
使用python将markdown文件生成pdf文件
开发语言·python·pdf
凯_kyle15 分钟前
Python 算法竞赛 —— 基础篇(更新ing)
笔记·python·算法
j_xxx404_18 分钟前
C++算法入门:二分查找合集(二分查找|在排序数组中查找元素的第一个和最后一个位置)
开发语言·c++
天远Date Lab19 分钟前
Java微服务实战:聚合型“全能小微企业报告”接口的调用与数据清洗
java·大数据·python·微服务