Python中带有SQLite3类型的参数出错错误:不支持+:'SQLite3.Cursor'和'str'的操作数类型

2024-04-27 04:51:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我是一个编码和这个新社区的初学者。我需要你的帮助来理解为什么不可能得到这个解决方案。我想从一个条目中获取一个数字,然后与同一条记录的最后一条记录相加,这样我就可以将其相加

这是我的密码:

def add_stock(self):
    time = datetime.now().strftime("%B %d, %Y")
    hour = datetime.now().strftime("%I:%M%p")
    query = 'SELECT totalstock FROM stocks WHERE name = ? AND MovementID = ( SELECT max( MovementID ) FROM stocks)'
    parameters = (self.name.get(),)
    lastrecord = self.run_query(query, parameters)
    total = lastrecord + self.quantity.get()
    if self.validation():
        query = 'INSERT INTO stocks VALUES(NULL, ?, ?, ?, ?, ?)'
        parameters = (self.name.get(), self.quantity.get(), total, time, hour)
        self.run_query(query, parameters)
        self.message['text'] = 'Movement {} added succesfully'.format(self.name.get())
        self.name.delete(0, END)
        self.quantity.delete(0, END)
    else:
        self.message['text'] = 'Name and Quantity required'
    self.get_product()

但是有点问题,有人能帮我吗

这是全部代码:

from tkinter import *
from tkinter import ttk
from datetime import datetime
import sqlite3

class Main:

    db_name = 'materiales.db'
    
    def __init__(self,window):
        self.wind = window
        self.wind.title('Stock App')

        #create frame
        frame = LabelFrame(self.wind, text = 'Add stock')
        frame.grid(row = 0, column = 0, columnspan = 3, pady = 20)

        # Name Input
        Label(frame, text = 'Name: ').grid(row = 1, column = 0)
        self.name = Entry(frame)
        self.name.focus()
        self.name.grid(row = 1, column = 1)

        # Quantity Input
        Label(frame, text = 'Quantity: ').grid(row = 2, column = 0)
        self.quantity = Entry(frame)
        self.quantity.grid(row = 2, column = 1)

        # Button Add Stock
        ttk.Button(frame, text = 'Add Stock', command = self.add_stock).grid(row = 3, columnspan = 2, sticky = W + E)

        #Log Message
        self.message = Label(text = '', fg = 'red')
        self.message.grid(row = 3, column = 0, columnspan = 2, sticky = W + E)
        
        # Table
        self.tree = ttk.Treeview(height = 10, columns = 2)
        self.tree.grid(row = 4, column = 0, columnspan = 2)
        self.tree.heading('#0', text = 'Name', anchor = CENTER)
        self.tree.heading('#1', text = 'Stock', anchor = CENTER)

        #Buttons
        ttk.Button(text = 'DELETE', command = self.delete_product).grid(row = 5, column = 0, sticky = W + E) 
        ttk.Button(text = 'MODIFY', command = self.modify_product).grid(row = 5, column = 1, sticky = W + E)       
        self.get_product()


    def run_query(self, query, parameters = ()):
        with sqlite3.connect(self.db_name) as conn:
            cursor = conn.cursor()
            result = cursor.execute(query, parameters)
            conn.commit()
        return result

    def get_product(self):
        records = self.tree.get_children()
        for element in records:
            self.tree.delete(element)
        query = 'SELECT * FROM product ORDER BY name DESC'
        db_rows = self.run_query(query)
        for row in db_rows:
            self.tree.insert('', 0, text = row[1], values = row[2])

    def validation(self):
        return len(self.name.get()) != 0 and len(self.quantity.get()) !=0

    def add_stock(self):
        time = datetime.now().strftime("%B %d, %Y")
        hour = datetime.now().strftime("%I:%M%p")
        query = 'SELECT totalstock FROM stocks WHERE name = ? AND MovementID = ( SELECT max( MovementID ) FROM stocks)'
        parameters = (self.name.get(),)
        lastrecord = self.run_query(query, parameters)
        total = lastrecord + self.quantity.get()
        if self.validation():
            query = 'INSERT INTO stocks VALUES(NULL, ?, ?, ?, ?, ?)'
            parameters = (self.name.get(), self.quantity.get(), total, time, hour)
            self.run_query(query, parameters)
            self.message['text'] = 'Movement {} added succesfully'.format(self.name.get())
            self.name.delete(0, END)
            self.quantity.delete(0, END)
        else:
            self.message['text'] = 'Name and Quantity required'
        self.get_product()

    def delete_product(self):
        try:
            self.tree.item(self.tree.selection())['text'][0]
        except IndexError as e:
            self.message['text'] = 'Please Select a Record'
            return
        name = self.tree.item(self.tree.selection())['text']
        query = 'DELETE FROM product WHERE name = ?'
        self.run_query(query,(name,))
        self.message['text'] = 'Product {} deleted succesfully'.format(name)
        self.get_product()

    def modify_product(self):
        try:
            self.tree.item(self.tree.selection())['text'][0]
        except IndexError as e:
            self.message['text'] = 'Please Select a Record'
            return
        name = self.tree.item(self.tree.selection())['text']
        old_price = self.tree.item(self.tree.selection())['values'][0]
        self.edit_wind = Toplevel()
        self.edit_wind.title = 'Edit Product'

        #Old Name
        Label(self.edit_wind, text = 'Old Name: ').grid(row = 0, column = 1)
        Entry(self.edit_wind, textvariable = StringVar(self.edit_wind, value = name), state = 'readonly').grid(row = 0, column = 2)

        #New Name
        Label(self.edit_wind, text = 'New Name: ').grid(row = 1, column = 1)
        new_name = Entry(self.edit_wind)
        new_name.grid(row = 1, column = 2)

        #Old Price
        Label(self.edit_wind, text = 'Old Price: ').grid(row = 2, column = 1)
        Entry(self.edit_wind, textvariable = StringVar(self.edit_wind, value = old_price), state = 'readonly').grid(row = 2, column = 2)

        #New Price
        Label(self.edit_wind, text = 'New Price: ').grid(row = 3, column = 1)
        new_price = Entry(self.edit_wind)
        new_price.grid(row = 3, column = 2)

        Button(self.edit_wind, text = 'Update', command = lambda: self.edit_records(new_name.get(), name, new_price.get(), old_price)).grid(row = 4, column = 2, sticky = W)


    def edit_records(self, new_name, name, new_price, old_price):
        query = 'UPDATE product SET name = ?, precio = ? WHERE  name = ? AND precio = ?'
        parameters = (new_name, new_price, name, old_price)
        self.run_query(query, parameters)
        self.edit_wind.destroy()
        self.message['text'] = 'Record {} updated successfully'.format(name)
        self.get_product()

        
if __name__ == '__main__':
    window = Tk()
    application = Main(window)
    window.mainloop()

提前感谢并致以亲切的问候


Tags: textnameselftreemessagegetcolumnproduct
1条回答
网友
1楼 · 发布于 2024-04-27 04:51:25

在代码的第72行出现异常。代码尝试将字符串对象添加到sqlite.Cursor对象,但由于这些类型与该操作不兼容,因此操作失败

相反,您需要提取返回的Cursor对象中保存的数据,可以这样做:

total = lastrecord.fetchone()[0]

fetchone()返回类型为tuple的数据的第一行。元组中的第一项是查询的值,在本例中,该值假定为整数。无法添加由self.quantity.get()返回的字符串,因此需要将其转换为整数(假设它是整数..它可以是另一个数字类型)以计算新的总数:

total += int(self.quantity.get())

相关问题 更多 >