【问题标题】:Linking tkinter and sqlite3连接 tkinter 和 sqlite3
【发布时间】:2021-05-21 11:22:11
【问题描述】:

我是一个新的 Python 程序员,我正在使用 tkinter 和 sqlite3 创建一个电话簿应用程序,但我遇到了一个问题。该应用程序运行没有问题,但没有插入或删除数据,尽管它打印(成功插入)并成功删除)。请为您提供帮助。代码如下,提前致谢:

from tkinter import*
import tkinter as tk
from tkinter import ttk 
import sqlite3

class Phonebook2:   
def __init__(self, master):

    lblName = ttk.Label(top, text="Name:")
    lblName.grid(row = 0, column = 0, sticky=W)
    lblPhone = ttk.Label(top, text="Phone number:")
    lblPhone.grid(row=1, column=0, sticky=W)

    self.name= StringVar()
    self.txtName = Entry(top, textvariable=self.name)
    self.txtName.grid(row=0, column=1, padx=0, pady=0, sticky=EW, columnspan=19)

    self.num= IntVar()
    self.txtPhone = Entry(top, textvariable=self.num)
    self.txtPhone.grid(row=1, column=1, sticky=EW)


    btnAdd = ttk.Button(top, text="Add", command=self.insert)
    btnAdd.grid(row=0, column=20, sticky=EW, padx=2, pady=2)
    btnDelete = ttk.Button(top, text="Delete", command=self.delete)
    btnDelete.grid(row=1, column=20, sticky=EW, padx=2)
    btnClear = ttk.Button(top, text="Clear", command=self.clear)
    btnClear.grid(row=2, column=20, sticky=EW, padx=2)
    btnSearch = ttk.Button(top, text="Search")
    btnSearch.grid(row=3, column=20, sticky=EW, padx=2)
    btnExit = ttk.Button(top, text="Exit", command = exit)
    btnExit.grid(row=4, column=20)


def exit(self):
    top.destroy()


def insert(self):

    NM = self.txtName.get()
    PH = self.txtPhone.get()
    conn = sqlite3.connect ('Phonebook.db')
    print ("connection opened for insertion...")
    cursor = conn.cursor()
    cursor.execute ("""INSERT INTO Phonebook (NAME, PHONE_NUMBER) VALUES (?, ?)""", (NM, PH))
    conn.commit()
    conn.close()
    print ('Inserted successfully')


def delete(self):
    conn = sqlite3.connect('Phonebook.db')
    print ("Connection opened for deletion...")
    cursor = conn.cursor()
    cursor.execute ("DELETE FROM Phonebook")
    conn.commit()
    conn.close()
    print ("All records are deleted successfully...")


def clear(self):
    self.txtName.delete(0, END)
    self.txtPhone.delete(0, END)


top = Tk()
top.overrideredirect(True)
top.eval('tk::PlaceWindow . center')
top.title("PhoneBook2")
application = Phonebook2(top)

top.mainloop()

【问题讨论】:

  • 您的 SQL 语句似乎没问题。您是否在控制台或终端中收到任何错误?同时发布“Phonebook.db”的架构。
  • 在数据库中创建电话簿表后,插入对我有用。
  • 您在“删除”中忘记了 entry.get() 和 sql WHERE 。 (如果要删除特定项目)

标签: python sqlite tkinter


【解决方案1】:

您可以尝试这样插入:

query = ("INSERT INTO Phonebook (NAME, PHONE_NUMBER)""VALUES (%s, %s)")
    data = (NM,PH)
    cursor.execute(query, data)
    connection.commit()

确保在您的 sqlite 中获取正确的列“NAME”和“PHONE_NUMBER”的名称

【讨论】:

  • sqlite3 使用? 作为占位符,而不是%s
【解决方案2】:
def del_something():

    conn = sqlite3.connect("Phonebook.db")
    cur = conn.cursor()

    cur.execute("DELETE FROM phonebook WHERE oid = " + del_ent.get()) # <- change entry
    del_ent.delete(0, END) # clear entry

    conn.commit()
    conn.close()

【讨论】:

  • 您可以更改oid。这只是一个例子
  • 你注意到delete()里面的OP信息是“所有记录都被成功删除...”吗?这意味着 OP 想要删除表中的所有记录。
  • 不过,输入没有被清理。
  • 所以我不知道是否可以,我有来自这里的信息:youtube.com/watch?v=c9_gcIeAru0(6 分钟和 14:50)它对我有用。这与 oid 只是一个例子。你可以用其他任何东西来改变它。
  • 好吧,你不应该在那里关注那个视频,那样做是非常糟糕的。您的查询容易受到 SQL 注入的影响。应该是cur.execute("DELETE FROM phonebook WHERE oid = ?",(del_ent.get(),))
猜你喜欢
  • 2015-05-17
  • 2021-06-04
  • 2021-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-11
  • 2016-10-13
  • 1970-01-01
相关资源
最近更新 更多