【问题标题】:Python TypeError: 'Event' object does not support indexingPython TypeError:“事件”对象不支持索引
【发布时间】:2017-12-19 08:11:28
【问题描述】:

我知道这个问题之前已经回答过,但这并不能解决我的问题。

这是错误代码:

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()

还有包含 insert_row 方法的 db_demo_2 文件:

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()

【问题讨论】:

  • 我认为错误消息解释了发生了什么。您正在尝试访问 Event 对象,就像它是 List 一样。它行不通。将print(args) 作为函数的第一条语句,以查看您的insert_row 函数实际接收的内容。
  • @Himal 这是我打印列表时得到的(,)
  • 如您所见,它是一个tkinter.Event 对象。您没有传递姓名/电话。您可以更新您的问题以包含相关的 tkinter 代码吗?包括tkinter 标签。

标签: python tkinter python-3.5


【解决方案1】:

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

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 代码位于同一文件中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-23
    • 2018-01-07
    • 2013-06-23
    • 2019-04-18
    • 2016-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多