我有错误“TypeError:'type'对象不可下标”

Posted

技术标签:

【中文标题】我有错误“TypeError:\'type\'对象不可下标”【英文标题】:I have error "TypeError: 'type' object is not subscriptable"我有错误“TypeError:'type'对象不可下标” 【发布时间】:2017-08-22 08:26:14 【问题描述】:

我想通过以 tkinter 的形式编写数据来将数据添加到 Access,但我有一个错误。怎么了?我试图改变con.close ()的位置,但它没有帮助,如果我把它放在def之前,我什至会出现另一个错误

from tkinter import *
import pypyodbc
import ctypes

form=Tk ()
form.title ("Add data")
form.geometry ('400x200')

#Create connection
con = pypyodbc.connect('DRIVER=Microsoft Access Driver (*.mdb);UID=admin;UserCommitSync=Yes;Threads=3;SafeTransactions=0;PageTimeout=5;MaxScanRows=8;MaxBufferSize=2048;FIL=MS Access;DriverId=25;DefaultDir=C:/Users/HP/Desktop/PITL;DBQ=C:/Users/HP/Desktop/PITL/PITL.mdb;')
cursor = con.cursor ()

a = Entry (form, width=20, font="Arial 16")
a.pack ()
b = Entry (form, width=20, font="Arial 16")
b.pack ()

def Add (event):
    cursor.execute ("INSERT INTO Crime (`Number_of_article`, `ID_of_criminal`) VALUES (?, ?)", (a, b))

Button=Button(form, text = 'PUSH ME')
Button.pack ()
Button.bind ('<Button-1>', Add)

form.mainloop ()

con.commit ()
cursor.close ()
con.close ()

错误是:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\HP\AppData\Local\Programs\Python\Python36-32\lib\tkinter\__init__.py", line 1699, in __call__
    return self.func(*args)
  File "C:\Users\HP\Desktop\PITL\ADD DATA.py", line 19, in Add
    cursor.execute ("INSERT INTO Crime (`Number_of_article`, `ID_of_criminal`) VALUES (?, ?)", (a, b))
  File "C:\Users\HP\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pypyodbc-1.3.4-py3.6.egg\pypyodbc.py", line 1491, in execute
    self._BindParams(param_types)
  File "C:\Users\HP\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pypyodbc-1.3.4-py3.6.egg\pypyodbc.py", line 1296, in _BindParams
    if param_types[col_num][0] == 'u':
TypeError: 'type' object is not subscriptable

【问题讨论】:

因为a/bEntry 对象...我猜你需要它们的值,例如:a.get()b.get() 在你的@987654331 @...? @JonClements,是的,我需要他们的价值观 在“eg”之后的第一条评论中,您认为与您当前的代码有什么不同...? @Bagacan 你能不能edit你的问题表明......? @JonClements 哈利路亚!这是工作。谢谢,我只是犯了一个愚蠢的错误。 (def Add (): cursor.execute ("INSERT INTO Crime (Number_of_article, ID_of_criminal) VALUES (?, ?)", (a.get(), b.get())) con.commit () cursor.close () con.close ()我不得不写这个 【参考方案1】:

假设您的 SQL 输入正常工作,那么这方面的 tkinter 并不太棘手。

首先,在class 中执行此操作可能更容易,以使变量传递更容易。

您也不需要绑定到button,您可以向其添加command 属性。

请参阅下面的代码示例:

from tkinter import *

class App:
    def __init__(self, root):
        self.root = root
        #create our entry boxes
        self.entry1 = Entry(self.root)
        self.entry2 = Entry(self.root)
        #create out button, instead of binding we associate a command to it
        self.button = Button(self.root, text="Insert", command=self.command)
        #pack our objects
        self.entry1.pack()
        self.entry2.pack()
        self.button.pack()
    def command(self):
        #this command outputs the results of the two entry boxes
        #so this is where you'd implement your database entry
        print("Insert "+self.entry1.get()+" & "+self.entry2.get())
        #above, *object*.get() is used to return the value of the object rather than the object itself

root = Tk()
App(root)
root.mainloop()

【讨论】:

不是我。我只是想像你一样写我的代码 可能有人认为我的回答过于基于意见 您实际上并没有解决问题中的错误。相反,您只是重写了程序并省略了导致问题的代码。 @BryanOakley 因为用户试图重新发明***。我为他们提供了一个替代脚本,它使用相同的库和语言实现相同的输出。 你没有解释为什么你的代码更好。问题的根源在于 OP 使用的是小部件而不是小部件中的值。您的代码正确使用了该值,但您没有解释这是原因。对于初学者来说,他们无法知道真正的问题是什么——是他们没有使用课程吗?是不是他们没有将他们的功能命名为command?是因为他们使用a 而不是a.get()?他们无法从您的回答中了解到这一点。

以上是关于我有错误“TypeError:'type'对象不可下标”的主要内容,如果未能解决你的问题,请参考以下文章

为啥我有这个错误重载运算符?

为啥我有这个 laravel 错误?

检测碰撞错误说当我有 8 个参数时我有 9 个参数 [重复]

我有一个错误,我不确定它为啥不工作(线程)

我有这样的问题期待帮助致命错误:未捕获的错误:找不到类'Illuminate\Foundation\Application'[重复]

错误 C2512 但我有可用的默认构造函数