pyqt项目实战(二)

学习目标:

提示:这里可以添加学习目标

例如:

  • 给表格初始化数据

创建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_())


​​​​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值