学习目标:
提示:这里可以添加学习目标
例如:
- 给表格初始化数据
创建STAUS_MAPPING全局变量,供后面调用。因为我这里没有从网上爬取数据,这里创建一个db的json文件。
db='[["B0816","AMD","https://www.amzaon",300.0,0,146,1,5],\
["B0800","AMD","https://www.amzaon",200.0,0,168,1,5],\
["B0834","AMD","https://www.amzaon",305.0,0,163,1,5],\
["B08456","AMD","https://www.amzaon",100.0,0,155,11,5]]'
STATUS_MAPPING={
0:"初始化中",
1:"待执行",
2:"正在执行",
3:"完成并提醒",
10:"异常并停止",
11:"初始化失败",
}
#3.2初始化数据 读取文件
import json
data_list=json.loads(db)
current_row_count=table_widget.rowCount()#当前表格有多少行
for row_list in data_list:
#添加行
table_widget.insertRow(current_row_count)
# 写数据
for i,ele in enumerate(row_list):
ele=STATUS_MAPPING[ele] if i==6 else ele #此处非常巧妙 有bug
cell = QTableWidgetItem(str(ele))
if i in [0,4,5,6]:
cell.setFlags(Qt.ItemIsSelectable|Qt.ItemIsEnabled)
table_widget.setItem(current_row_count, i, cell)
current_row_count+=1
给添加按钮绑定槽函数,并编写对应逻辑代码
btn_add.clicked.connect(self.event_add_click)
#点击添加按钮
def event_add_click(self):
#1获取内容
text=self.txt_asin.text()
text=text.strip()
if not text:
QMessageBox.warning(self,"error","商品信息输入错误")
return
asin,price=text.split("=")
price=float(price)
#2加入表格(型号,底价)
new_row_list=["asin","","",price,0,0,0,5]
#3发送请求 爬虫
current_row_count=self.table_widget.rowCount()
self.table_widget.insertRow(current_row_count)
# 写数据
for i, ele in enumerate(new_row_list):
ele = STATUS_MAPPING[ele] if i == 6 else ele # 此处非常巧妙 有bug
cell = QTableWidgetItem(str(ele))
if i in [0, 4, 5, 6]:
cell.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
self.table_widget.setItem(current_row_count, i, cell)
#初始化 爬虫要写数据,不能在主线程爬虫,会卡住。用信号传递
thread=NewTaskThread(self)
thread.success.connect(self.init_task_success_callback)
thread.error.connect(self.init_task_error_callback)
thread.start()
创建子线程,在子线程里自定义信号,用来更新数据。这里没有从网上获取数据,就用a,b 模拟了一下。代码如下:
class NewTaskThread(QThread):
#信号 更新具体数据
success=pyqtSignal(int,str,str,str)
error=pyqtSignal(int,str,str,str)
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
def run(self):
'''具体该做的事'''
self.success.emit(1,'xx','xx','ass')
self.error.emit(1,'xx','xx','degg')
定义两个回调函数,用来接受信号
def init_task_success_callback(self,index,asin,title,utl):
print(index,asin,title,utl)
def init_task_error_callback(self,index,asin,title,utl):
print(index, asin, title, utl)
以上为本次学习内容。完整代码如下:
db='[["B0816","AMD","https://www.amzaon",300.0,0,146,1,5],\
["B0800","AMD","https://www.amzaon",200.0,0,168,1,5],\
["B0834","AMD","https://www.amzaon",305.0,0,163,1,5],\
["B08456","AMD","https://www.amzaon",100.0,0,155,11,5]]'
STATUS_MAPPING={
0:"初始化中",
1:"待执行",
2:"正在执行",
3:"完成并提醒",
10:"异常并停止",
11:"初始化失败",
}
from PyQt5.Qt import *
class Window(QWidget):
def __init__(self,parent=None):
super().__init__(parent)
self.parent=parent
self.setWindowTitle("NB的系统")
self.resize(1220,760)
self.setup_ui()
def setup_ui(self):
layout=QVBoxLayout()
self.setLayout(layout)
layout.addLayout(self.init_header())
layout.addLayout(self.init_form())
layout.addLayout(self.init_table())
layout.addLayout(self.init_footer())
def init_header(self):
header_layout=QHBoxLayout()
btn_start=QPushButton("开始")
btn_stop=QPushButton("停止")
header_layout.addWidget(btn_start)
header_layout.addWidget(btn_stop)
header_layout.addStretch()
return header_layout
def init_form(self):
#2.创建上面标题布局
form_layout=QHBoxLayout()
#2.1 输入框
self.txt_asin=QLineEdit()
self.txt_asin.setPlaceholderText("请输入商品ID的价格,例如:B0818JJQQ8=88")
form_layout.addWidget(self.txt_asin)
#2.2 添加按钮
btn_add=QPushButton("添加")
btn_add.clicked.connect(self.event_add_click)
form_layout.addWidget(btn_add)
return form_layout
def init_table(self):
# 3 创建中间表格
table_layout=QHBoxLayout()
#3.1 创建表格
table_widget=QTableWidget(0,8)
self.table_widget=table_widget
table_header=[
{"field":"asin","text":"ASIN","width":120},
{"field":"title","text":"标题","width":150},
{"field":"url","text":"URL","width":400},
{"field":"price","text":"底价","width":100},
{"field":"sucess","text":"成功次数","width":100},
{"field":"error","text":"失败次数","width":100},
{"field":"status","text":"状态","width":100},
{"field":"frequency","text":"频率(N秒/次)","width":100},
]
for idx,info in enumerate(table_header):
item = QTableWidgetItem()
item.setText(info["text"])
table_widget.setHorizontalHeaderItem(idx,item)
table_widget.setColumnWidth(idx, info['width'])
table_layout.addWidget(table_widget)
#3.2初始化数据 读取文件
import json
data_list=json.loads(db)
current_row_count=table_widget.rowCount()#当前表格有多少行
for row_list in data_list:
#添加行
table_widget.insertRow(current_row_count)
# 写数据
for i,ele in enumerate(row_list):
ele=STATUS_MAPPING[ele] if i==6 else ele #此处非常巧妙 有bug
cell = QTableWidgetItem(str(ele))
if i in [0,4,5,6]:
cell.setFlags(Qt.ItemIsSelectable|Qt.ItemIsEnabled)
table_widget.setItem(current_row_count, i, cell)
current_row_count+=1
return table_layout
def init_footer(self):
footer_layout=QHBoxLayout()
label_status=QLabel("未检测")
footer_layout.addWidget(label_status)
footer_layout.addStretch()
btn_reinit=QPushButton("重新初始化")
footer_layout.addWidget(btn_reinit)
btn_recheck=QPushButton("重新检测")
footer_layout.addWidget(btn_recheck)
btn_reset_count=QPushButton("次数清零")
footer_layout.addWidget(btn_reset_count)
btn_delete=QPushButton("删除检测项")
footer_layout.addWidget(btn_delete)
return footer_layout
#点击添加按钮
def event_add_click(self):
#1获取内容
text=self.txt_asin.text()
text=text.strip()
if not text:
QMessageBox.warning(self,"error","商品信息输入错误")
return
asin,price=text.split("=")
price=float(price)
#2加入表格(型号,底价)
new_row_list=["asin","","",price,0,0,0,5]
#3发送请求 爬虫
current_row_count=self.table_widget.rowCount()
self.table_widget.insertRow(current_row_count)
# 写数据
for i, ele in enumerate(new_row_list):
ele = STATUS_MAPPING[ele] if i == 6 else ele # 此处非常巧妙 有bug
cell = QTableWidgetItem(str(ele))
if i in [0, 4, 5, 6]:
cell.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEnabled)
self.table_widget.setItem(current_row_count, i, cell)
#初始化 爬虫要写数据,不能在主线程爬虫,会卡住。用信号传递
thread=NewTaskThread(self)
thread.success.connect(self.init_task_success_callback)
thread.error.connect(self.init_task_error_callback)
thread.start()
def init_task_success_callback(self,index,asin,title,utl):
print(index,asin,title,utl)
def init_task_error_callback(self,index,asin,title,utl):
print(index, asin, title, utl)
class NewTaskThread(QThread):
#信号 更新具体数据
success=pyqtSignal(int,str,str,str)
error=pyqtSignal(int,str,str,str)
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
def run(self):
'''具体该做的事'''
self.success.emit(1,'xx','xx','ass')
self.error.emit(1,'xx','xx','degg')
if __name__ == '__main__':
import sys
app=QApplication(sys.argv)
win=Window()
win.show()
sys.exit(app.exec_())