小白求救,我写了一个从数据库中读取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