商品选购页面包含商品选购标题,商品搜索框和搜索按钮,用户信息,商品列表展示以及商品图片展示。如下图所示:


入门 PyQt6 看过来(项目)27 在线购物-商品选购_开发语言

1 页面设计

我们根据上图展示在QTDesigner里设计如下:


入门 PyQt6 看过来(项目)27 在线购物-商品选购_pyqt_02

商品选购、商品名称、用户、图片等文字用QLabel标签。查询和选购以及打印用QPushButton按钮。列表采用QTableView列表视图。

其中他们的属性名字命名如下:


入门 PyQt6 看过来(项目)27 在线购物-商品选购_pyqt6_03

2 功能实现

2.1 查询功能


入门 PyQt6 看过来(项目)27 在线购物-商品选购_Qt_04

点击商品查询,输入内容或者空的时候,会在列表里展示查询到的商品信息。

def query(self):
        global commoditys
        pnm=self.lePNm.text()
        book=openpyxl.load_workbook(r'data/netshop.xlsx')
        sheet=book['商品表']
        commoditys=[]
        list_key=['商品号','商品名称','类别编号','价格','库存量']
        list_val=[]
        r=0
        #读取“商品名称”列的全部数据,与用户输入的关键词逐一对比
        for cell_pname in tuple(sheet.columns)[2][1:]:
            r+=1
            #符合条件的关键词在于商品名称中
            if pnm in cell_pname.value:
                commodity=[cell.value for cell in tuple(sheet.rows)[r]]
                #填写list_val[],并与list_key[]合并成一个字典记录
                list_val.append(commodity[0]) #商品号
                list_val.append(commodity[1]) #商品名称
                list_val.append(commodity[2]) #类别编号
                list_val.append(commodity[3]) #价格
                list_val.append(commodity[4]) #库存
                #合成为字典
                dict_com=dict(zip(list_key, list_val))
                commoditys.append(dict_com)
                list_val=[]
        #清除模型里的旧数据
        self.im.clear()
        #重新生成表头
        self.initTableHeader()
        r=0
        #遍历商品信息列表,将查询到的记录逐条加载进模型
        for k, dict_com in enumerate(commoditys):
            self.im.setItem(r,0,QStandardItem(str(dict_com['商品号'])))
            self.im.setItem(r,1,QStandardItem(str(dict_com['类别编号'])))
            self.im.setItem(r,2,QStandardItem(str(dict_com['商品名称'])))
            self.im.setItem(r,3,QStandardItem(str(dict_com['价格'])))
            self.im.setItem(r,4,QStandardItem(str(dict_com['库存量'])))
            r+=1
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.

槽函数绑定信号:

self.pbQue.clicked.connect(self.query)
  • 1.

此时列表信息就会展示出来,如下图:


入门 PyQt6 看过来(项目)27 在线购物-商品选购_pyqt6_05


2.2 图片展示

当我们点击列表商品行的时候,右侧出现图片显示:


入门 PyQt6 看过来(项目)27 在线购物-商品选购_Qt_06


此时我们用showImg函数实现:

def showImg(self):
		#获取当前行数据
        row=self.tbvCom.currentIndex().row()
        index=self.tbvCom.model().index(row,0)
        pid=self.tbvCom.model().data(index)
        image=QPixmap(r'image/goods/'+pid+'.jpg')
        self.lbImg.setPixmap(image)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
2.3 选购

选购会思考是否下单过而未结算以及下单过已结算和未下单的情况,分别列出来,做成分支处理。下过单未结算,就是已选购,不需要重复选购,下单过结算了,可以重新下单。未下单的可以直接下单。

def preShop(self):
        book=openpyxl.load_workbook(r'data/netshop.xlsx')
        sheet1=book['订单项表']
        sheet2=book['订单表']
        #首先判断该用户在此前有没有选购(尚未结算)过商品
        #1 找出订单项表中所有状态不为“结算”的记录,将它们对应的订单号放入一个集合
        r=0
        set_oid=set()
        for cell_stat in tuple(sheet1.columns)[3][1:]:
            r += 1
            if cell_stat.value != '结算':
                orderitem=[cell.value for cell in tuple(sheet1.rows)[r]]
                set_oid.add(orderitem[0])
        #2 读取订单表的订单号、用户账号列,合成为字典
        list_oid=[cell.value for cell in tuple(sheet2.columns)[0][1:]]
        list_uid=[cell.value for cell in tuple(sheet2.columns)[1][1:]]
        dict_ouid=dict(zip(list_oid,list_uid))
        #3 用第一步得到的订单号集合到第2步得到的字典中去对比
        oid =0
        exist = False
        for id in enumerate(set_oid):
            for key_oid, val_uid in dict_ouid.items():
                if (id[1] == key_oid) and (appvar.getID() ==val_uid):
                    exist=True
                    oid=id[1]
                    break
        row =self.tbvCom.currentIndex().row()
        index=self.tbvCom.model().index(row,0)
        #若没有比中,说明时初次选购
        if exist ==False:
            #读取订单项表的订单号列,生成预备订单号(当前已有订单号最大值+1)
            list_oid=[cell.value for cell in tuple(sheet1.columns)[0][1:]]
            if list_oid == []:
                old=1
            else:
                old=max(list_oid)+1
            pid=eval(self.tbvCom.model().data(index))
            #写入预备订单项
            s1r=str(sheet1.max_row+1)
            sheet1['A'+s1r].alignment=Alignment(horizontal='center')
            sheet1['B'+s1r].alignment=Alignment(horizontal='center')
            sheet1['C'+s1r].alignment=Alignment(horizontal='center')
            sheet1['A' +s1r]=oid
            sheet1['B'+s1r]=pid
            sheet1['C'+s1r]=1
            sheet1['D'+s1r]='选购'
            #写入预备订单
            s2r=str(sheet2.max_row +1)
            sheet2['A'+s2r].alignment=Alignment(horizontal='center')
            sheet2['A'+s2r]=oid
            sheet2['B'+s2r]=appvar.getID()
        #若比中,说明该用户此前已选/订购过商品
        else:
            pid=eval(self.tbvCom.model().data(index))
            #添加此次选购的订单项
            #确定插入记录的行号
            s1r=str(sheet1.max_row+1)
            sheet1['A' + s1r].alignment = Alignment(horizontal='center')
            sheet1['B' + s1r].alignment = Alignment(horizontal='center')
            sheet1['C' + s1r].alignment = Alignment(horizontal='center')
            sheet1['A' + s1r] = oid
            sheet1['B' + s1r] = pid
            sheet1['C' + s1r] = 1
            sheet1['D' + s1r] = '选购'
        book.save(r'data/netshop.xlsx')
        book.close()
        msgbox=QMessageBox.information(self, '提示', '已选购。')
        print(msgbox)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
2.4 打印

点击打印按钮实现打印预览功能,效果如下:


入门 PyQt6 看过来(项目)27 在线购物-商品选购_pyqt_07

# 点击打印
	def printTable(self):
        #创建打印预览对话框
        dlg=QPrintPreviewDialog()
        dlg.paintRequested.connect(self.handlePrint)
        dlg.exec()
	# 执行打印函数
 	def handlePrint(self,printer):
        doc=QTextDocument()
        cur=QTextCursor(doc)
        #设定标题文字格式、写标题
        fmt_textchar=QTextCharFormat()
        fmt_textchar.setFontFamily('微软雅黑')
        fmt_textchar.setFontPointSize(10)
        fmt_textblock=QTextBlockFormat()
        fmt_textblock.setAlignment(Qt.AlignmentFlag.AlignHCenter)
        cur.setBlockFormat(fmt_textblock)
        cur.insertText("商品名称中包含 '"+ self.lePNm.text()+"'", fmt_textchar)
        #设定表格式
        fmt_table=QTextTableFormat()
        fmt_table.setBorder(1)
        fmt_table.setBorderStyle(QTextTableFormat.BorderStyle.BorderStyle_Solid)
        fmt_table.setCellSpacing(0)
        fmt_table.setTopMargin(0)
        fmt_table.setCellPadding(4)
        fmt_table.setAlignment(Qt.AlignmentFlag.AlignHCenter)
        cur.insertTable(self.im.rowCount()+1, self.im.columnCount(),fmt_table)
        #写表头
        for i in range(0, self.im.columnCount()):
            header=self.im.headerData(i, Qt.Orientation.Horizontal)
            cur.insertText(header)
            cur.movePosition(QTextCursor.MoveOperation.NextCell)
        #写表记录
        for row in range(0,self.im.rowCount()):
            for col in range(0, self.im.columnCount()):
                index=self.im.index(row, col)
                cur.insertText(str(index.data()))
                cur.movePosition(QTextCursor.MoveOperation.NextCell)
        doc.print(printer)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.

3 完整代码

完整代码如下,大家可以参考使用:

UI页面代码:

from PyQt6 import QtCore, QtGui, QtWidgets
from PyQt6.QtWidgets import QMainWindow


class Ui_MainWindow(QMainWindow):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(812, 452)
        self.centralwidget = QtWidgets.QWidget(parent=MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.lbTitle = QtWidgets.QLabel(parent=self.centralwidget)
        self.lbTitle.setGeometry(QtCore.QRect(340, 30, 111, 31))
        font = QtGui.QFont()
        font.setPointSize(18)
        self.lbTitle.setFont(font)
        self.lbTitle.setLayoutDirection(QtCore.Qt.LayoutDirection.LeftToRight)
        self.lbTitle.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
        self.lbTitle.setObjectName("lbTitle")
        self.tbvCom = QtWidgets.QTableView(parent=self.centralwidget)
        self.tbvCom.setGeometry(QtCore.QRect(20, 120, 601, 261))
        font = QtGui.QFont()
        font.setPointSize(12)
        self.tbvCom.setFont(font)
        self.tbvCom.setSelectionMode(QtWidgets.QAbstractItemView.SelectionMode.SingleSelection)
        self.tbvCom.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectionBehavior.SelectRows)
        self.tbvCom.setObjectName("tbvCom")
        self.tbvCom.horizontalHeader().setDefaultSectionSize(120)
        self.tbvCom.horizontalHeader().setMinimumSectionSize(25)
        self.tbvCom.horizontalHeader().setStretchLastSection(True)
        self.tbvCom.verticalHeader().setVisible(False)
        self.lbName = QtWidgets.QLabel(parent=self.centralwidget)
        self.lbName.setGeometry(QtCore.QRect(20, 90, 71, 16))
        font = QtGui.QFont()
        font.setPointSize(12)
        self.lbName.setFont(font)
        self.lbName.setObjectName("lbName")
        self.lePNm = QtWidgets.QLineEdit(parent=self.centralwidget)
        self.lePNm.setGeometry(QtCore.QRect(100, 90, 121, 21))
        self.lePNm.setObjectName("lePNm")
        self.pbQue = QtWidgets.QPushButton(parent=self.centralwidget)
        self.pbQue.setGeometry(QtCore.QRect(230, 90, 75, 24))
        font = QtGui.QFont()
        font.setPointSize(12)
        self.pbQue.setFont(font)
        self.pbQue.setObjectName("pbQue")
        self.lbUsr = QtWidgets.QLabel(parent=self.centralwidget)
        self.lbUsr.setGeometry(QtCore.QRect(400, 90, 191, 21))
        font = QtGui.QFont()
        font.setPointSize(14)
        self.lbUsr.setFont(font)
        self.lbUsr.setText("")
        self.lbUsr.setObjectName("lbUsr")
        self.lbUserName = QtWidgets.QLabel(parent=self.centralwidget)
        self.lbUserName.setGeometry(QtCore.QRect(350, 90, 41, 20))
        font = QtGui.QFont()
        font.setPointSize(12)
        self.lbUserName.setFont(font)
        self.lbUserName.setObjectName("lbUserName")
        self.pbPrint = QtWidgets.QPushButton(parent=self.centralwidget)
        self.pbPrint.setGeometry(QtCore.QRect(534, 380, 81, 31))
        font = QtGui.QFont()
        font.setPointSize(12)
        self.pbPrint.setFont(font)
        self.pbPrint.setObjectName("pbPrint")
        self.lbPic = QtWidgets.QLabel(parent=self.centralwidget)
        self.lbPic.setGeometry(QtCore.QRect(690, 120, 54, 16))
        font = QtGui.QFont()
        font.setPointSize(12)
        self.lbPic.setFont(font)
        self.lbPic.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter)
        self.lbPic.setObjectName("lbPic")
        self.lbImg = QtWidgets.QLabel(parent=self.centralwidget)
        self.lbImg.setGeometry(QtCore.QRect(653, 160, 141, 131))
        self.lbImg.setText("")
        self.lbImg.setScaledContents(True)
        self.lbImg.setObjectName("lbImg")
        self.pbPre = QtWidgets.QPushButton(parent=self.centralwidget)
        self.pbPre.setGeometry(QtCore.QRect(690, 320, 75, 24))
        font = QtGui.QFont()
        font.setPointSize(12)
        self.pbPre.setFont(font)
        self.pbPre.setObjectName("pbPre")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "商品选购"))
        self.lbTitle.setText(_translate("MainWindow", "商品选购"))
        self.lbName.setText(_translate("MainWindow", "商品名称"))
        self.pbQue.setText(_translate("MainWindow", "查询"))
        self.lbUserName.setText(_translate("MainWindow", "用户:"))
        self.pbPrint.setText(_translate("MainWindow", "打印..."))
        self.lbPic.setText(_translate("MainWindow", "图片"))
        self.pbPre.setText(_translate("MainWindow", "选购"))
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.

功能实现逻辑代码:

# -*- coding:utf-8 -*-
"""
------------------------------------------------
File Name: PreShop.py
Description:
Author: lzq
date:2024-08-07 09:10
------------------------------------------------
"""
import sys

import openpyxl as openpyxl
import printer
from PyQt6.QtCore import Qt
from PyQt6.QtGui import QIcon, QPixmap, QStandardItemModel, QStandardItem, QTextDocument, QTextCursor, QTextCharFormat, \
    QTextBlockFormat, QTextTableFormat
from PyQt6.QtPrintSupport import QPrintPreviewDialog
from PyQt6.QtWidgets import QMessageBox, QApplication
from openpyxl.styles import Alignment

from pyqt6Learn.myNetShop import appvar
from pyqt6Learn.myNetShop.ui.PreShop_ui import Ui_MainWindow

#存放查询到的商品数据(字典列表)
commoditys=[]
class PreWindow(Ui_MainWindow):
    def __init__(self):
        super(PreWindow,self).__init__()
        self.setupUi(self)
        self.initUi()
    def initUi(self):
        self.setWindowIcon(QIcon('image/netshop.png'))
        self.setWindowFlag(Qt.WindowType.MSWindowsFixedSizeDialogHint)
        self.lePNm.returnPressed.connect(self.query)
        self.pbQue.clicked.connect(self.query)
        self.tbvCom.clicked.connect(self.showImg)
        self.pbPrint.clicked.connect(self.printTable)
        self.pbPre.clicked.connect(self.preShop)
        #获取当前登录用户账号
        self.lbUsr.setText(appvar.getID())
        #生成商品信息表头
        self.initTableHeader()
        # 购物车图片
        self.pbPre.setIcon(QIcon(QPixmap(r'image/cart.png')))

    def initTableHeader(self):
        #创建模型
        self.im=QStandardItemModel()
        self.im.setHorizontalHeaderItem(0,QStandardItem('商品号'))
        self.im.setHorizontalHeaderItem(1,QStandardItem('商品名称'))
        self.im.setHorizontalHeaderItem(2,QStandardItem('类别'))
        self.im.setHorizontalHeaderItem(3,QStandardItem('价格'))
        self.im.setHorizontalHeaderItem(4,QStandardItem('库存量'))
        self.tbvCom.setModel(self.im)
        #设置表格各列的宽度
        self.tbvCom.setColumnWidth(0,70)
        self.tbvCom.setColumnWidth(1,300)
        self.tbvCom.setColumnWidth(2,60)
        self.tbvCom.setColumnWidth(3,70)
        self.tbvCom.setColumnWidth(4,40)
    def query(self):
        global commoditys
        pnm=self.lePNm.text()
        book=openpyxl.load_workbook(r'data/netshop.xlsx')
        sheet=book['商品表']
        commoditys=[]
        list_key=['商品号','商品名称','类别编号','价格','库存量']
        list_val=[]
        r=0
        #读取“商品名称”列的全部数据,与用户输入的关键词逐一对比
        for cell_pname in tuple(sheet.columns)[2][1:]:
            r+=1
            #符合条件的关键词在于商品名称中
            if pnm in cell_pname.value:
                commodity=[cell.value for cell in tuple(sheet.rows)[r]]
                #填写list_val[],并与list_key[]合并成一个字典记录
                list_val.append(commodity[0]) #商品号
                list_val.append(commodity[1]) #商品名称
                list_val.append(commodity[2]) #类别编号
                list_val.append(commodity[3]) #价格
                list_val.append(commodity[4]) #库存
                #合成为字典
                dict_com=dict(zip(list_key, list_val))
                commoditys.append(dict_com)
                list_val=[]
        #清除模型里的旧数据
        self.im.clear()
        #重新生成表头
        self.initTableHeader()
        r=0
        #遍历商品信息列表,将查询到的记录逐条加载进模型
        for k, dict_com in enumerate(commoditys):
            self.im.setItem(r,0,QStandardItem(str(dict_com['商品号'])))
            self.im.setItem(r,1,QStandardItem(str(dict_com['类别编号'])))
            self.im.setItem(r,2,QStandardItem(str(dict_com['商品名称'])))
            self.im.setItem(r,3,QStandardItem(str(dict_com['价格'])))
            self.im.setItem(r,4,QStandardItem(str(dict_com['库存量'])))
            r+=1

    def showImg(self):
        print("展示图片")
        row=self.tbvCom.currentIndex().row()
        index=self.tbvCom.model().index(row,0)
        pid=self.tbvCom.model().data(index)
        image=QPixmap(r'image/goods/'+pid+'.jpg')
        self.lbImg.setPixmap(image)
    def printTable(self):
        #创建打印预览对话框
        dlg=QPrintPreviewDialog()
        dlg.paintRequested.connect(self.handlePrint)
        dlg.exec()

    def handlePrint(self,printer):
        doc=QTextDocument()
        cur=QTextCursor(doc)
        #设定标题文字格式、写标题
        fmt_textchar=QTextCharFormat()
        fmt_textchar.setFontFamily('微软雅黑')
        fmt_textchar.setFontPointSize(10)
        fmt_textblock=QTextBlockFormat()
        fmt_textblock.setAlignment(Qt.AlignmentFlag.AlignHCenter)
        cur.setBlockFormat(fmt_textblock)
        cur.insertText("商品名称中包含 '"+ self.lePNm.text()+"'", fmt_textchar)
        #设定表格式
        fmt_table=QTextTableFormat()
        fmt_table.setBorder(1)
        fmt_table.setBorderStyle(QTextTableFormat.BorderStyle.BorderStyle_Solid)
        fmt_table.setCellSpacing(0)
        fmt_table.setTopMargin(0)
        fmt_table.setCellPadding(4)
        fmt_table.setAlignment(Qt.AlignmentFlag.AlignHCenter)
        cur.insertTable(self.im.rowCount()+1, self.im.columnCount(),fmt_table)
        #写表头
        for i in range(0, self.im.columnCount()):
            header=self.im.headerData(i, Qt.Orientation.Horizontal)
            cur.insertText(header)
            cur.movePosition(QTextCursor.MoveOperation.NextCell)
        #写表记录
        for row in range(0,self.im.rowCount()):
            for col in range(0, self.im.columnCount()):
                index=self.im.index(row, col)
                cur.insertText(str(index.data()))
                cur.movePosition(QTextCursor.MoveOperation.NextCell)
        doc.print(printer)

    #选购功能函数
    def preShop(self):
        book=openpyxl.load_workbook(r'data/netshop.xlsx')
        sheet1=book['订单项表']
        sheet2=book['订单表']
        #首先判断该用户在此前有没有选购(尚未结算)过商品
        #1 找出订单项表中所有状态不为“结算”的记录,将它们对应的订单号放入一个集合
        r=0
        set_oid=set()
        for cell_stat in tuple(sheet1.columns)[3][1:]:
            r += 1
            if cell_stat.value != '结算':
                orderitem=[cell.value for cell in tuple(sheet1.rows)[r]]
                set_oid.add(orderitem[0])
        #2 读取订单表的订单号、用户账号列,合成为字典
        list_oid=[cell.value for cell in tuple(sheet2.columns)[0][1:]]
        list_uid=[cell.value for cell in tuple(sheet2.columns)[1][1:]]
        dict_ouid=dict(zip(list_oid,list_uid))
        #3 用第一步得到的订单号集合到第2步得到的字典中去对比
        oid =0
        exist = False
        for id in enumerate(set_oid):
            for key_oid, val_uid in dict_ouid.items():
                if (id[1] == key_oid) and (appvar.getID() ==val_uid):
                    exist=True
                    oid=id[1]
                    break
        row =self.tbvCom.currentIndex().row()
        index=self.tbvCom.model().index(row,0)
        #若没有比中,说明时初次选购
        if exist ==False:
            #读取订单项表的订单号列,生成预备订单号(当前已有订单号最大值+1)
            list_oid=[cell.value for cell in tuple(sheet1.columns)[0][1:]]
            if list_oid == []:
                old=1
            else:
                old=max(list_oid)+1
            pid=eval(self.tbvCom.model().data(index))
            #写入预备订单项
            s1r=str(sheet1.max_row+1)
            sheet1['A'+s1r].alignment=Alignment(horizontal='center')
            sheet1['B'+s1r].alignment=Alignment(horizontal='center')
            sheet1['C'+s1r].alignment=Alignment(horizontal='center')
            sheet1['A' +s1r]=oid
            sheet1['B'+s1r]=pid
            sheet1['C'+s1r]=1
            sheet1['D'+s1r]='选购'
            #写入预备订单
            s2r=str(sheet2.max_row +1)
            sheet2['A'+s2r].alignment=Alignment(horizontal='center')
            sheet2['A'+s2r]=oid
            sheet2['B'+s2r]=appvar.getID()
        #若比中,说明该用户此前已选/订购过商品
        else:
            pid=eval(self.tbvCom.model().data(index))
            #添加此次选购的订单项
            #确定插入记录的行号
            s1r=str(sheet1.max_row+1)
            sheet1['A' + s1r].alignment = Alignment(horizontal='center')
            sheet1['B' + s1r].alignment = Alignment(horizontal='center')
            sheet1['C' + s1r].alignment = Alignment(horizontal='center')
            sheet1['A' + s1r] = oid
            sheet1['B' + s1r] = pid
            sheet1['C' + s1r] = 1
            sheet1['D' + s1r] = '选购'
        book.save(r'data/netshop.xlsx')
        book.close()
        msgbox=QMessageBox.information(self, '提示', '已选购。')
        print(msgbox)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.
  • 119.
  • 120.
  • 121.
  • 122.
  • 123.
  • 124.
  • 125.
  • 126.
  • 127.
  • 128.
  • 129.
  • 130.
  • 131.
  • 132.
  • 133.
  • 134.
  • 135.
  • 136.
  • 137.
  • 138.
  • 139.
  • 140.
  • 141.
  • 142.
  • 143.
  • 144.
  • 145.
  • 146.
  • 147.
  • 148.
  • 149.
  • 150.
  • 151.
  • 152.
  • 153.
  • 154.
  • 155.
  • 156.
  • 157.
  • 158.
  • 159.
  • 160.
  • 161.
  • 162.
  • 163.
  • 164.
  • 165.
  • 166.
  • 167.
  • 168.
  • 169.
  • 170.
  • 171.
  • 172.
  • 173.
  • 174.
  • 175.
  • 176.
  • 177.
  • 178.
  • 179.
  • 180.
  • 181.
  • 182.
  • 183.
  • 184.
  • 185.
  • 186.
  • 187.
  • 188.
  • 189.
  • 190.
  • 191.
  • 192.
  • 193.
  • 194.
  • 195.
  • 196.
  • 197.
  • 198.
  • 199.
  • 200.
  • 201.
  • 202.
  • 203.
  • 204.
  • 205.
  • 206.
  • 207.
  • 208.
  • 209.
  • 210.
  • 211.
  • 212.
  • 213.
  • 214.

本文至此结束,喜欢点赞关注,您的关注和点赞是路卿进步的动力哦!老Baby们!!!