2014-02-15 26 views
1

我对Python很新,但对于团队设计项目,我需要创建一个代码,将信息输入到连接到mysql表的Tkinter窗口并相应地更新该表。如果相同的ID再次输入应该更新数量+1:如何解决'MySQLConverter'对象没有属性'_entry_to_mysql'的库存输入,python-mysql?

from Tkinter import* 
import tkMessageBox 
import tkFont 
import mysql.connector 
import time 



def AddItem(): 
    print "Added Item" 
    print "ID:" + ID.get() 
    print "Item Name:" + ItemName.get() 
    print "Price Per Item:" + PricePerItem.get() 
    print "Manufacturer:" + Manufacturer.get() 

在S = INSERT INTO库存...是扔我大吃一惊,我可以输入信息到Tkinter的窗口,但是当我选择Add Item按钮,出现以下错误:

ProgrammingError:处理格式参数失败; “MySQLConverter”对象有没有属性“_entry_to_mysql”

cnx = mysql.connector.connect(user='root',password='cj92cj', 
            database='INVENTORY', use_unicode=False) 
    s = "INSERT INTO inventory (ID, Manufacturer, ItemName, PricePerItem, Quantity) VALUES({},{},{},{},1) ON DUPLICATE KEY UPDATE Quantity= Quantity + 1, Manufacturer = VALUES(Manufacturer), ItemName = VALUES(ItemName), PricePerItem = VALUES(PricePerItem);".format(ID.get(),Manufacturer.get(),ItemName.get(),PricePerItem.get()) 

    print ID.get() 
    print s 
    cursor = cnx.cursor() 
    cursor.execute(s, (ID, Manufacturer, ItemName, PricePerItem, Quantity)) 
    cursor.close() 
    cnx.commit() 
    cnx.close() 

def ClearEntries(): 
    ItemName.delete(0,END) 
    PricePerItem.delete(0,END) 
    Manufacturer.delete(0,END) 

我一直在尝试各种各样的事情“的”好几个小时,但我有麻烦找出使用正确的语法。

下面是Tkinter窗口代码,如果有帮助的话。

def InformationInput(): 
    BigFont=tkFont.Font(family="Arial", size=14, weight="bold") 
    root.title("Enter Item Information") 
    root.geometry("1000x400") 
    root.bind("<Return>", lambda event: AddItem()) 
    lbl1 = Label(root, text="ID:") 
    lbl2 = Label(root, text="Item Name:") 
    lbl3 = Label(root, text="Price Per Item:") 
    lbl4 = Label(root, text="Manufacturer:") 
    lbl9 = Label(root, text="Enter Item Information", height=3, fg="red", font=BigFont) 

    global ID, ItemName, PricePerItem, Manufacturer 
    ID = Entry(root, width=25, textvariable=ID) 
    ItemName = Entry(root, width=20, textvariable=ItemName) 
    PricePerItem = Entry(root, width=10, textvariable=PricePerItem) 
    Manufacturer = Entry(root, width=25, textvariable=Manufacturer) 
    button1 = Button(root, text="Add Item", command=AddItem, width=15) 
    button2 = Button(root, text="Clear Entries", command=ClearEntries, width=15) 
    button3 = Button(root, text="Exit", command=root.destroy, width=15) 

    lbl9.grid(column=2, row=1, columnspan=5) 
    lbl1.grid(column = 1, row = 4, sticky="nw") 
    ID.grid(column = 2, row = 4, sticky="nw") 
    lbl2.grid(column = 3, row = 4) 
    ItemName.grid(column = 4, row = 4) 
    lbl3.grid(column = 5, row = 4) 
    PricePerItem.grid(column = 6, row = 4, sticky="w") 
    lbl4.grid(column = 3, row = 10) 
    Manufacturer.grid(column = 4, row = 10) 
    button1.grid(column=3, row=15, sticky="e", pady=20) 
    button2.grid(column=4, row=15) 
    button3.grid(column=5, row=15, sticky="w") 



root = Tk() 
ID = IntVar() 
ItemName = StringVar() 
PricePerItem = IntVar() 
Manufacturer = StringVar() 
Quantity = IntVar() 

InformationInput() 
root.mainloop() 

回答

1

您必须在您的查询或数据库驱动程序中使用参数标记,在这种情况下,MySQL连接器/ Python将会发生错误。此外,您必须传递可以转换的值。 MySQLConverter不知道如何转换entry对象,所以它告诉你它不能转换它(尽管它可以更明确一些)。

下面是一个例子(简化):

s = ("INSERT INTO inventory (ID, Manufacturer, ItemName, PricePerItem, Quantity) " 
    "VALUES (%s, %s, %s, %s, %s) ON DUP..") 
cursor = cnx.cursor() 
cursor.execute(s, (ID.get(), Manufacturer.get(), ItemName.get(), 
        PricePerItem.get(), Quantity.get())) 

我冒昧opening a bug report改善的错误消息。

其他评论:我不认为插入时需要提供ID吗?通常这是一个AUTO_INCREMENT。

相关问题