2017-07-14 85 views
0

我知道这个问题已经回答过,但是这并没有解决我的问题。Python TypeError:'Event'对象不支持索引

这是错误代码:

def insert_row(*args): 
     for i in args: 
      name1 = i[0] 
      phone1 = i[1] 
      c.execute('''INSERT INTO users(name,phone)VALUES(?,?)''', (name1, phone1)) 
      print('Record inserted') 

这是回溯:

Exception in Tkinter callback 
Traceback (most recent call last): 
    File "C:\Users\ak00479324\AppData\Local\Programs\Python\Python35-32\lib\tkinter\__init__.py", line 1550, in __call__ 
    return self.func(*args) 
    File "D:/ak00479324/TECHM/Python POC\db_demo.py", line 13, in insert_row 
    name1 = i[0] 
TypeError: 'Event' object does not support indexing 

编辑:以下是Tkinter的代码:

from tkinter import * 
from tkinter import ttk 
import db_demo_2 

root = Tk() 
root.title("Form") 

frame = ttk.Frame(root, padding="20 20 50 50") 
frame.grid(column=0, row=0, sticky=(N, W, E, S)) 

name = StringVar() 
phone = StringVar() 

name_entry = ttk.Entry(frame, width=20, textvariable=name) 
name_entry.grid(column=3, row=1, sticky=(W, E)) 

phone_entry = ttk.Entry(frame, width=20, textvariable=phone) 
phone_entry.grid(column=3, row=2, sticky=(W, E)) 

ttk.Button(frame, text="Enter", command=db_demo_2.insert_row).grid(column=3, row=3, sticky=W) 

ttk.Label(frame, text="Name").grid(column=1, row=1, sticky=W) 
ttk.Label(frame, text="Phone").grid(column=1, row=2, sticky=W) 

for child in frame.winfo_children(): child.grid_configure(padx=10, pady=10) 

name_entry.focus() 
root.bind('<Return>', db_demo_2.insert_row) 

root.mainloop() 

而且db_demo_2文件,该文件包含insert_row方法:

import sqlite3 

sqlite_file = 'db_1.sqlite' 

conn = sqlite3.connect(sqlite_file) 
c = conn.cursor() 

c.execute('''CREATE TABLE IF NOT EXISTS users(id INTEGER PRIMARY KEY, name TEXT, phone INTEGER)''') 

def insert_row(*args): 
    print(*args) 
    name1 = args[0] 
    phone1 = args[1] 
    for i in args: 
     c.execute('''INSERT INTO users(name,phone) VALUES(?,?)''',(name1,phone1)) 
     print('Record inserted') 

conn.commit() 
+0

我认为错误信息解释了发生了什么事。你正试图访问一个'Event'对象,就像它是一个'List'。它不会工作。放一个'print(args)'作为函数的第一个语句来查看你的'insert_row'函数实际上正在接收什么。 – Himal

+0

@Himal这是当我打印列表()时得到的结果, –

+0

正如你所看到的,它是一个'tkinter.Event'对象。你没有通过姓名/电话。你能否更新你的问题以包含相关的tkinter代码?还包括'tkinter'标签。 – Himal

回答

1

您不能从“args”中获取名称/电话。你必须使用你创建的StringVar对象。另请注意,我们通常使用event=None而不是*args作为您在bind中使用的函数。

def insert_row(event=None): 
    name1 = name.get() # get the value from the "name" StringVar 
    phone1 = phone.get() 
    c.execute('''INSERT INTO users(name,phone)VALUES(?,?)''', (name1, phone1)) 
    print('Record inserted') 

此代码需要与tkinter代码位于同一文件中。

+0

它的工作,谢谢:) –