专业养老 2021-05-08 12:01 采纳率: 0%
浏览 94
已结题

PyQt5 中的多线程问题

小白求救,我写了一个从数据库中读取url地址后通过爬虫下载图片到本地后在程序上实时显示出来的功能,但是一刷新后界面会卡死,上网搜了一下是我把数据读取和显示功能写在同一线程下,需要用到Qthread多线程实现,但网上搜到的实例对我的帮助还是比较有限,想问问大佬们该怎么实现,代码如下:

import os
from screen import *
from PyQt5 import QtWidgets
from PyQt5.QtCore import QTimer, QDateTime
from PyQt5.QtGui import QImage,QPixmap,QStandardItem
from PyQt5.QtWidgets import QGraphicsPixmapItem,QGraphicsScene
import cv2
from Img import get_img





class MainController(QtWidgets.QMainWindow,Ui_MainWindow):
    def __init__(self):
        super(MainController, self).__init__()
        # self.thread = Worker()
        self.setupUi(self)
        self.showImage('image/init.jpg',600)
        self.timer = QTimer()
        self.timer.timeout.connect(self.showTime)
        self.timer.start(1000)
    def display(self,data):
        if "name" in data:
            self.Assembly.setText(data["name"])
            response = get_img(data['name'])
            if response == 2:
                self.help.hide()
            else:
                path = os.path.abspath('./image') +'\\'+ data['name'] + '.jpg'
                self.showImage(path,600)
        if "order_num" in data:
            self.label_4.setText(data["order_num"])
        if "p_code" in data:
            self.label_6.setText(data["p_code"])
        if "p_name" in data:
            self.label_9.setText(data["p_name"])
        if "total" in data:
            self.label_8.setText(data["total"])
        if "p_number" in data:
            self.p_number.setText(data["p_number"])
        if "BOM" in data:
            bom = data["BOM"]
            self.init_table(bom)
        if "STEP" in data:
            step = data["STEP"]
            self.init_step_table(step)
    def showTitle(self,tt):
        self.Assembly.setText(tt)

    def showLogo(self,logo):
        self.label.setText(logo)

    def showTime(self):
        time = QDateTime.currentDateTime()
        timeDisplay = time.toString("yyyy-MM-dd hh:mm:ss dddd")
        self.showtime.setText(timeDisplay)

    def closeEvent(self, event):
        os._exit(0)

    def show_selected_image(self, imageFile):
        try:
            image = cv2.imread(imageFile)  # 读取图像
            image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
            height = image.shape[0]
            width = image.shape[1]
            self.zoomscale = 1
            frame = QImage(image, width, height, QImage.Format_RGB888)
            pix = QPixmap.fromImage(frame)
            self.item = QGraphicsPixmapItem(pix)
            self.item.setScale(self.zoomscale)
            self.scene = QGraphicsScene()  # 创建场景
            self.scene.addItem(self.item)
            self.gview.setScene(self.scene)
        except Exception as e :
            print(e)

    def showImage(self,imageName,h):
        try:
            self.scaled_pixmap = QPixmap(imageName).scaledToHeight(h)
            self.image_lbl.setPixmap(self.scaled_pixmap)
        except Exception as e:
            print(e)

    def init_table(self,bom):
        try:
            self.HeaderList = ["编号"]
            self.HeaderList.append("名称")
            self.HeaderList.append("数量")
            self.DataModel = QtGui.QStandardItemModel()
            self.DataModel.setHorizontalHeaderLabels(self.HeaderList)  #

            vr = bom.split("],[")
            i = 0
            for v in vr:
                # print(v)
                v = v.replace("]","").replace("[","")
                d = v.split(",")
                self.DataModel.setItem(i, 0, QStandardItem(d[0]))
                self.DataModel.setItem(i, 1, QStandardItem(d[2]))
                self.DataModel.setItem(i, 2, QStandardItem(d[1]))
                i = i + 1

            self.tableView.setModel(self.DataModel)
            self.tableView.verticalHeader().hide()
            self.tableView.horizontalHeader().setStretchLastSection(True)
            self.tableView.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
            self.tableView.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
            # self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
            print(1)
            return True
        except Exception as e:
            print(e)

    def init_step_table(self, step):
        try:
            self.HeaderList.append("名称")
            self.HeaderList.append("指令")
            self.DataModel = QtGui.QStandardItemModel()
            self.DataModel.setHorizontalHeaderLabels(self.HeaderList)  #
            vr = step.split("],[")
            i = 0
            for v in vr:
                print(v)
                v = v.replace("]", "").replace("[", "")
                d = v.split(",")
                self.DataModel.setItem(i, 0, QStandardItem(d[0]))
                self.DataModel.setItem(i, 1, QStandardItem(d[1]))
                i = i + 1

            self.tableView.setModel(self.DataModel)
            self.tableView.verticalHeader().hide()
            self.tableView.horizontalHeader().setStretchLastSection(True)
            self.tableView.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
            self.tableView.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
            # self.tableView.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
            return True
        except Exception as e:
            print(e)

其中response = get_img(data['name'])中的get_img方法代码如下:

import psycopg2
import requests
import re
import os

find_csrf_token = re.compile(r'.*"csrf_token" value="(.*?)"')
find_img = re.compile(r'<img.*src="(.*?)"')

def get_img(name):
    session = requests.Session()
    url = 'XXXXXXXXXX'
    second_url = 'XXXXXXXXXXXXXX'
    header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'}
    session.get(url, headers=header)
    s_response = session.get(url=second_url, headers=header)
    result = re.findall(find_csrf_token, s_response.text)
    csrf_token = ''
    finnal = 'XXXXXXXXXXXXXXXX'
    header.update({'csrf_token': csrf_token})
    session.post(finnal, headers=header)
    for i in result:
        csrf_token = i
    conn = psycopg2.connect(XXXXXXXXXXXXXXX)
    cursor = conn.cursor()
    sql =f"""select qp.note from quality_point qp inner join mrp_routing_workcenter mrw on qp.operation_id=mrw.id where qp.title='{name}'"""
    find_name =f"""select title from quality_point where title='{name}'"""
    cursor.execute(find_name)
    rename = cursor.fetchone()
    if rename:
        for i in rename:
            name = i
    cursor.execute(sql)
    list = cursor.fetchone()
    if list:
        list = str(list)
        response = re.findall(find_img,list)
        if response:
            for i in response:
                end = 'http://139.196.175.131:8069' + i
                link_jpg = session.get(end, headers=header)
                dir = os.path.abspath('./image')
                dir += '\\' + name + '.jpg'
                if os.path.exists(f"""./image/{name}.jpg"""):
                    return 0
                else:
                    with open(dir, 'wb') as f:
                        f.write(link_jpg.content)
                        f.close()
                        return 1
        else:
            return 2
    else:
        return 2
  • 写回答

2条回答 默认 最新

  • 专业养老 2021-05-08 12:02
    关注

    对了,display的data参数接收的是从socket中传输的数据,想把这个get_img方法写在子线程里,但是又要用到传入主线程的data数据,就很迷惑了

    评论

报告相同问题?

悬赏问题

  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置