【问题标题】:How to display new add data on tkinter table without rerun the program?如何在不重新运行程序的情况下在 tkinter 表上显示新的添加数据?
【发布时间】:2021-04-10 13:34:58
【问题描述】:

我想在 tkinter 表上显示 sqlite 数据库,当我添加新数据时,我需要再次运行程序,然后新的数据会显示在表上。

如何编辑代码以将新数据与旧数据一起显示而无需再次运行数据?我知道可以使用.after().update() 但不知道在哪里添加?

例如:(原始表格显示)
1

2


当我单击按钮“添加”时添加新数据“3”时,我想在表格上显示它

1

2

3

这是完整的代码,谢谢帮助!

from tkinter import *
import tkinter as tk
import sqlite3


def add():
    b1 = Button(window,text = "Add",bg="lightblue",fg = "black",command=clicked)
    b1.grid(column=0,row=0)
    window.mainloop()

   
def clicked():
    def new():
        import sqlite3 #create new customer
        conn = sqlite3.connect('d:\\hw4.db')
        cursor = conn.cursor()
        name1=e_name.get()
        gender1=e_ged.get()
        birth1=e_bir.get()
        sql="insert into ss (name,gender,birth) values ('"+name1+"','"+gender1+"','"+birth1+"')"
        cursor.execute(sql)
        conn.commit()
        conn.close()
        top.destroy()
    top = Toplevel()
    top.title("New")
    #1
    name=Label(top,text="Name: ").grid(column=3,row=0,sticky='w')
    e_name=StringVar()
    e_name=Entry(top,text=e_name)
    e_name.grid(column=4,row=0)
    #2
    name=Label(top,text="Gender: ").grid(column=3,row=1,sticky='w')
    e_ged=StringVar()
    e_ged=Entry(top,text=e_ged)
    e_ged.grid(column=4,row=1)
    #3
    name=Label(top,text="Birth: ").grid(column=3,row=2,sticky='w')
    e_bir=StringVar()
    e_bir=Entry(top,text=e_bir)
    e_bir.grid(column=4,row=2)
    
    #add
    c=Button(top,text="Add",bg='lemonchiffon',fg='black',command=new)
    c.grid(column=3,row=4,sticky='w')
    top.mainloop()

    
    
def main():
    frame=Frame(window)
    import sqlite3
    conn = sqlite3.connect('d:\\hw4.db')
    cursor = conn.cursor()
    sql = 'select rowid,* from ss'
    cursor.execute(sql)
    result=cursor.fetchall();
    for r in range (len(result)):
        rlbls=[None,None,None,None,None,None]
        rlbls[0]=Label(frame,text=str(result[r][0]))
        rlbls[0].grid(column=0,row=r)
        rlbls[1]=Label(frame,text=str(result[r][1]))
        rlbls[1].grid(column=1,row=r)
        rlbls[2]=Label(frame,text=str(result[r][2]))
        rlbls[2].grid(column=2,row=r)
        rlbls[3]=Label(frame,text=str(result[r][3]))
        rlbls[3].grid(column=3,row=r)
        btn1 = Button(window, text="edit")
        btn1.grid(column=4, row=r+1)
        btn2 = Button(window, text="delete")
        btn2.grid(column=5, row=r+1)
        
    #show    
    conn=sqlite3.connect('d:\\hw4.db')
    c = conn.cursor()
    r = conn.execute('''SELECT * from ss''');
    i =1
    for n in r:
        for j in range(len(n)):
            e=Label(window,text=n[j])
            e.grid(column=j,row=i)
        i=i+1
    
       
    conn.commit()
    conn.close()
    return frame

window = Tk()
window.title("add")
window.geometry('200x200')

main()
add()

【问题讨论】:

  • 您可以添加一个更新按钮,它只会刷新删除值并插入新值。此外,您的 SQL 查询容易受到 SQL 注入。
  • 在 clicked() 函数中,我使用“添加”按钮添加新数据,我可以使用相同的按钮刷新表格吗?
  • 给定代码的clicked()函数中没有添加按钮。
  • 对不起,我完全失明了:p。我认为你应该在这里重新考虑你的设计。代码结构对我来说似乎很奇怪。但无论如何,基本思想是创建一个删除现有值然后插入新获取的值的函数。您可以等待更好的建议。

标签: python sqlite tkinter


【解决方案1】:

于是我做了一个简单的示例代码:

from tkinter import Tk, Label, Entry, Button


data = ['Info about 1', 'Info about 2']


def submit():
    given_data = user_input.get()
    user_input.delete(0, 'end')
    data.append(given_data)
    Label(root, text=given_data).pack()


root = Tk()

user_input = Entry(root)
user_input.pack()

submit_btn = Button(root, text='Submit', command=submit)
submit_btn.pack()

for value in data:
    Label(root, text=value).pack()

root.mainloop()

因此,基本上重要的部分是您将拥有您的数据库,并且在提交功能中您只需将给定的信息附加到您的数据库中,但您还将使用该信息创建一个新标签并立即打包它。现在有 for 循环,所以基本上在你的情况下(你必须自己调整它)你仍然会在启动程序时读取数据库中的所有数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-27
    • 2021-09-13
    • 2016-12-26
    相关资源
    最近更新 更多