首页 > 解决方案 > 我正在尝试使用 tkinter for GUI 在 python 中为数据库编写代码。但是,当我按下提交按钮时,.get() 函数不起作用

问题描述

这是我正在处理的代码。在我创建 sumbit 函数的部分中,我尝试使用 .get() 函数,但它不起作用。此代码用于我目前正在做的评估,并在一个月内到期。我一直在 youtube 上观看 tkinter 视频,试图了解我在做什么,但是在重新观看视频后,我找不到我的代码和他的代码之间的任何区别。视频的链接是https://www.youtube.com/watch?v=YR3h2CY21-U&list=PLCC34OHNcOtoC6GglhF3ncJ5rLwQrLGnV&index=19。我最多12分50秒。

from tkinter import *
import sqlite3

root = Tk()
# root.geometry("800x500")


# Databases


# Create a database or connect to one
conn = sqlite3.connect('incidents.db')

# create a cursor
c = conn.cursor()

# Create table

'''c.execute("""CREATE TABLE incidents (
        first_name text,
        last_name text,
        address text,
        city text,
        state text,
        zipcode integer
        )""")'''


# Create Submit Function For database
def submit():
    # Create a database or connect to one
    conn = sqlite3.connect('incidents.db')
    # Create cursor
    c = conn.cursor()

    # Insert Into Table
    c.execute("INSERT INTO incidents VALUES (:name, :date, :address, :city, :state, :zipcode)",
              {
                  'name': Name.get(),
                  'date': date.get(),
                  'address': address.get(),
                  'city': city.get(),
                  'state': state.get(),
                  'zipcode': zipcode.get()
              })

    # Commit Changes
    conn.commit()

    # Close Connection
    conn.close()

    # Clear The Text Boxes
    Name.delete(0, END)
    date.delete(0, END)
    address.delete(0, END)
    city.delete(0, END)
    state.delete(0, END)
    zipcode.delete(0, END)


# Create Text Boxes
Name = Entry(root, width=30).grid(row=0, column=1, padx=20, pady=(10, 0))
date = Entry(root, width=30).grid(row=0, column=3)
address = Entry(root, width=30).grid(row=0, column=5)
city = Entry(root, width=30).grid(row=0, column=7)
state = Entry(root, width=30).grid(row=1, column=1)
zipcode = Entry(root, width=30).grid(row=1, column=3)
delete_box = Entry(root, width=30).grid(row=1, column=5, pady=5)

# Create Text Box Labels
name_label = Label(root, text="Name").grid(row=0, column=0, pady=(10, 0))
date_label = Label(root, text="Last Name").grid(row=0, column=2)
address_label = Label(root, text="Address").grid(row=0, column=4)
city_label = Label(root, text="City").grid(row=0, column=6)
state_label = Label(root, text="State").grid(row=1, column=0)
zipcode_label = Label(root, text="Zipcode").grid(row=1, column=2)
delete_box_label = Label(root, text="Select ID").grid(row=1, column=4, pady=5)

# Create Submit Button
submit_btn = Button(root, text="Add Record To Database", command=submit)
submit_btn.grid(row=6, column=0, columnspan=2, pady=10, padx=10, ipadx=100)

# Commit Changes
conn.commit()

# Close Connection
conn.close()


root.mainloop()

当我运行代码时,我收到此错误消息:

Exception in Tkinter callback
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/tkinter/__init__.py", line 1699, in __call__
    return self.func(*args)
  File "/Users/School/PycharmProjects/HelloWorld/Databases.py", line 39, in submit
    'name': Name.get(),
AttributeError: 'NoneType' object has no attribute 'get'

如果有人可以帮助我,将不胜感激。

标签: pythondatabasesqlitetkinter

解决方案


我认为您应该尝试的是: Name=tk.StringVar(root) tk.Entry(root,textvariable=Name).grid(row=0,column=1) 然后使用 Name.get() 另一件事而不是 import * 使用 import tkinter as tk(按照惯例)。对于您的情况,您可以在没有 tk 的情况下直接编写 StingVar() 和 Entry。字首。希望这会奏效


推荐阅读