Python 在发送http请求时动态更新PyQt5标签

Python 在发送http请求时动态更新PyQt5标签,python,python-3.x,pyqt,pyqt5,python-asyncio,Python,Python 3.x,Pyqt,Pyqt5,Python Asyncio,因此,我一直在使用基于模块的http请求开发一个异步pythonscraper。因此,我一直在使用asks和importlib,我想制作一个简单的小GUI,用请求的状态代码进行更新。我做到了 一切都很好,但我似乎有一个问题,因为请求发送成功,GUI显示,但它只在所有请求发送后显示,而不是在发送请求时动态显示 我一直在玩教程和Qtimer,但在我看到的所有教程和帮助线程中,例如: 我尝试根据自己的情况实现代码,但我唯一能做的就是让GUI在发送请求的同时显示出来,但在所有请求完成之前它一

因此,我一直在使用基于模块的http请求开发一个异步pythonscraper。因此,我一直在使用asks和importlib,我想制作一个简单的小GUI,用请求的状态代码进行更新。我做到了

一切都很好,但我似乎有一个问题,因为请求发送成功,GUI显示,但它只在所有请求发送后显示,而不是在发送请求时动态显示

我一直在玩教程和Qtimer,但在我看到的所有教程和帮助线程中,例如:

我尝试根据自己的情况实现代码,但我唯一能做的就是让GUI在发送请求的同时显示出来,但在所有请求完成之前它一直处于冻结状态(没有响应)

import trio
from asks import Session
import importlib
from PyQt5.QtWidgets import QLabel, QMainWindow, QApplication, QWidget, QVBoxLayout
from PyQt5 import QtCore
import qdarkstyle
app = QApplication(sys.argv)
app.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5())


module = importlib.import_module("get_module")
good = 0
bad = 0
total = 0

class Menu(QMainWindow):

    def __init__(self):
        global good, bad, total
        super().__init__()
        self.setWindowTitle("Status Codes")

        self.central_widget = QWidget()               
        self.setCentralWidget(self.central_widget)    
        lay = QVBoxLayout(self.central_widget)
        
        self.resize(500, 350)
        ok = QLabel("200: <font color='green'>0</font>")
        ok.setAlignment(QtCore.Qt.AlignHCenter)
        bad = QLabel("400: <font color='yellow'>0</font>")
        bad.setAlignment(QtCore.Qt.AlignHCenter)
        total = QLabel("Total: <font color='#00FF00'>0</font>")
        total.setAlignment(QtCore.Qt.AlignHCenter)
        r_total, r_good, r_bad  = self.check()
        QtCore.QTimer.singleShot(1000, lambda: self.updateLabels(r_total, r_good, r_bad))
        lay.addWidget(ok)
        lay.addWidget(bad)
        lay.addWidget(total)
        self.show()
        

    def check(self):
        async def worker1(s):
            global ok
            global bad
            global total
            if module.method.lower() == "get":
                r = await s.get(module.request(), params=module.settings())
            elif module.method.lower() == "post":
                r = await s.post(module.request(), data=module.settings())
            if any(x in r.status_code for x in module.error):
                print("BAD -- " + module.request())
                r_total += 1
                r_invalid += 1
            else:
                print("GOOD -- " + module.request())
                r_total += 1
                r_valid += 1
                print(r.text)
        async def worker2(s):
            global ok
            global bad
            global total
            if module.method.lower() == "get":
                r = await s.get(module.request(), params=module.settings())
            elif module.method.lower() == "post":
                r = await s.post(module.request(), data=module.settings())
            if any(x in r.status_code for x in module.error):
                print("BAD -- " + module.request())
                r_total += 1
                r_invalid += 1
            else:
                print("GOOD -- " + module.request())
                r_total += 1
                r_valid += 1
                print(r.text)                    
            
    async def example():
            
        s = Session(connections=module.connections)
        for i in range(10):
            async with trio.open_nursery() as nursery:
                nursery.start_soon(worker1, s)
                nursery.start_soon(worker2, s)

        trio.run(example)
        print("Total:", r_total)
        print("Total good:", r_valid)
        print("Total bad:", r_invalid)
        return r_total, r_valid, r_invalid
    def updateLabels(self, r_total, r_card, r_invalid):
        good.setText("200: <font color='green'>%s</font>" % (r_valid))
        bad.setText("400: <font color='#00FF00'>%s</font>" % (r_invalid))
        total.setText("Total: <font color='#F40D30'>%s</font>" % (r.total))

        
    
             
if __name__ == '__main__':        
    ex = Menu()
    sys.exit(app.exec_())
importtrio
从请求导入会话
导入导入库
从PyQt5.qtwidts导入QLabel、QMainWindow、QApplication、QWidget、QVBoxLayout
从PyQt5导入QtCore
导入qdarkstyle
app=QApplication(sys.argv)
app.setStyleSheet(qdarkstyle.load_样式表_pyqt5())
module=importlib.import\u模块(“get\u模块”)
好=0
坏=0
总数=0
类菜单(QMainWindow):
定义初始化(自):
全球好的,坏的,总的
super()。\uuuu init\uuuuu()
self.setWindowTitle(“状态代码”)
self.central_widget=QWidget()
self.setCentralWidget(self.central\u小部件)
lay=QVBoxLayout(self.central\u小部件)
自我调整大小(500350)
ok=QLabel(“200:0”)
ok.setAlignment(QtCore.Qt.AlignHCenter)
bad=QLabel(“400:0”)
错误的.setAlignment(QtCore.Qt.AlignHCenter)
总计=QLabel(“总计:0”)
total.setAlignment(QtCore.Qt.AlignHCenter)
r_总计,r_好,r_坏=自检()
QtCore.QTimer.singleShot(1000,lambda:self.updateLabels(r_总数,r_好,r_坏))
lay.addWidget(确定)
lay.addWidget(坏)
lay.addWidget(总计)
self.show()
def检查(自我):
异步def worker1:
全球ok
全球坏
全球总数
如果module.method.lower()=“get”:
r=wait s.get(module.request(),params=module.settings())
elif module.method.lower()=“post”:
r=等待s.post(module.request(),data=module.settings())
如果有(模块中x的r.status\U代码中x为错误):
打印(“错误--”+module.request())
r_总计+=1
r_无效+=1
其他:
打印(“良好--”+module.request())
r_总计+=1
r_有效+=1
打印(右文本)
异步def worker2:
全球ok
全球坏
全球总数
如果module.method.lower()=“get”:
r=wait s.get(module.request(),params=module.settings())
elif module.method.lower()=“post”:
r=等待s.post(module.request(),data=module.settings())
如果有(模块中x的r.status\U代码中x为错误):
打印(“错误--”+module.request())
r_总计+=1
r_无效+=1
其他:
打印(“良好--”+module.request())
r_总计+=1
r_有效+=1
打印(右文本)
异步定义示例():
s=会话(连接=模块连接)
对于范围(10)内的i:
与trio.open_托儿所()异步作为托儿所:
托儿所。尽快开始(工人1,s)
托儿所。尽快开始(工人2,s)
trio.run(示例)
打印(“总计:”,r_总计)
打印(“总良好:”,r_有效)
打印(“总错误:”,r_无效)
返回r_总计,r_有效,r_无效
def更新标签(自身、r_总计、r_卡、r_无效):
好的。setText(“200:%s”%(r_有效))
错误的.setText(“400:%s”%(r_无效))
total.setText(“总计:%s”%(r.total))
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
ex=菜单()
sys.exit(app.exec_())
现在我想让它做的是显示GUI,动态地(或每1秒)显示200、400和total标签,显示发出了多少请求,以及返回了多少200和400


但是,它会显示它们(它确实显示了总数、总数200和总数400),但只有在所有请求完成后,异步任务才会动态地阻塞GUI的线程,因此这些任务必须在另一个线程中执行,并通过信号发送到GUI,这也使我们能够分离业务逻辑和GUI,使其具有更清晰的代码:

获取模块.py

#编码:utf8
#==================================进口区=======================
#在这里,您可以导入网站所需的任何模块
从随机导入randint
#===========================================================
#===============================设置区域======================
#这里是您声明网站设置的地方,例如
#方法、错误键、成功键、自定义设置等。。。
name=“获取测试配置”
method='GET'#方法是GET、POST或CUSTOM
错误=['400',401',402',403',404',405',406',407',408',409',410',411',413',414',415',416',417',418',421',422',423',424',425',426',428',429',431',451',500',501',502',503 504',505',506',507',508',510',511']
连接数=5
#===========================================================
#=====================================定义区域=====================
#这里是定义的地方。
#有两个def:
#def request():返回url(带或不带修改)
#def settings():返回t