【问题标题】:How to display entry widget content in Treeview如何在 Treeview 中显示条目小部件内容
【发布时间】:2018-07-17 13:09:18
【问题描述】:

我正在尝试在treeview 中显示输入到treeview 小部件中的内容,然后将其保存在sqlite3 db 中。保存到db 中的内容但不显示idFist name 和@987654327 treeview中的@内容。

欢迎您提出建议以实现这一目标。

from tkinter import ttk
import tkinter as tk
import sqlite3


def connect():
    conn = sqlite3.connect("TRIAL.db")
    cur = conn.cursor()
    cur.execute("CREATE TABLE IF NOT EXISTS profile(id INTEGER PRIMARY KEY, 
First TEXT, Surname TEXT)")
    conn.commit()
    conn.close()



def Insert():
    conn = sqlite3.connect("TRIAL.db")
    cur = conn.cursor()
    fr=cur.execute("INSERT INTO profile (First, Surname) VALUES(?, ?)", 
    (first_text.get(), surname_text.get()))
    conn.commit()
    for items in fr:
        tree.insert('', tk.END, values=items)

    conn.close()



connect()  #  this to create the db


root = tk.Tk()
root.geometry("400x400")

tree= ttk.Treeview(root, column=("column", "colunn1"))
tree.heading("#0", text="NUMBER")
tree.heading("#1", text="FIRST NAME")
tree.heading("#2", text="SURNAME")
tree.pack()


first_text = tk.StringVar()
e1 = tk.Entry(root, textvariable=first_text)
e1.pack()
surname_text = tk.StringVar()
e2 = tk.Entry(root, textvariable=surname_text)
e2.pack()

b1 = tk.Button(text="add data", command=Insert)
b1.pack(side=tk.BOTTOM)

root.mainloop()

【问题讨论】:

    标签: python wpf tkinter treeview


    【解决方案1】:

    您的代码中的问题是for items in fr 不起作用。 Python 将 fr 视为一个空的可迭代对象(在 for 循环中放置一个 print 语句,您将看到它永远不会执行)。因此,要在树视图中插入数据,您可以直接从条目中获取它并使用cur.lastrowid 检索数据库id(我在问题How to retrieve inserted id after inserting row in SQLite using Python? 的答案中找到了这个解决方案):

    from tkinter import ttk
    import tkinter as tk
    import sqlite3
    
    
    def connect():
        conn = sqlite3.connect("TRIAL.db")
        cur = conn.cursor()
        cur.execute("CREATE TABLE IF NOT EXISTS profile(id INTEGER PRIMARY KEY, First TEXT, Surname TEXT)")
        conn.commit()
        conn.close()
    
    
    
    def Insert():
        conn = sqlite3.connect("TRIAL.db")
        cur = conn.cursor()
        data = (first_text.get(), surname_text.get())
        # insert data in db
        cur.execute("INSERT INTO profile (First, Surname) VALUES(?, ?)", data)  
        conn.commit()
        # insert data in treeview
        tree.insert('', tk.END, text=str(cur.lastrowid), values=data)  
        conn.close()
    
    
    connect()  #  this to create the db
    
    root = tk.Tk()
    root.geometry("400x400")
    
    tree= ttk.Treeview(root, column=("column", "colunn1"))
    tree.heading("#0", text="NUMBER")
    tree.heading("#1", text="FIRST NAME")
    tree.heading("#2", text="SURNAME")
    tree.pack()
    
    
    first_text = tk.StringVar()
    e1 = tk.Entry(root, textvariable=first_text)
    e1.pack()
    surname_text = tk.StringVar()
    e2 = tk.Entry(root, textvariable=surname_text)
    e2.pack()
    
    b1 = tk.Button(text="add data", command=Insert)
    b1.pack(side=tk.BOTTOM)
    
    root.mainloop()
    

    编辑:如果您使用“#1”、“#2”、“#3”列来避免使用特殊的 列'#0',那么你需要改变一点Insert:你需要在values而不是text中传递行ID。

    from tkinter import ttk
    import tkinter as tk
    import sqlite3
    
    def connect():
        conn = sqlite3.connect("TRIAL.db")
        cur = conn.cursor()
        cur.execute("CREATE TABLE IF NOT EXISTS profile(id INTEGER PRIMARY KEY, First TEXT, Surname TEXT)")
        conn.commit()
        conn.close()
    
    
    def Insert():
        conn = sqlite3.connect("TRIAL.db")
        cur = conn.cursor()
        data = (first_text.get(), surname_text.get())
        # insert data in db
        cur.execute("INSERT INTO profile (First, Surname) VALUES(?, ?)", data)  
        conn.commit()
        # insert data in treeview
        tree.insert('', tk.END, values=(str(cur.lastrowid),) + data)  
        conn.close()
    
    
    connect()  #  this to create the db
    
    root = tk.Tk()
    root.geometry("400x400")
    
    tree = ttk.Treeview(root, column=("column1", "column2", "column3"), show='headings')
    tree.heading("#1", text="NUMBER")
    tree.heading("#2", text="FIRST NAME")
    tree.heading("#3", text="SURNAME")
    tree.pack()
    
    first_text = tk.StringVar()
    e1 = tk.Entry(root, textvariable=first_text)
    e1.pack()
    surname_text = tk.StringVar()
    e2 = tk.Entry(root, textvariable=surname_text)
    e2.pack()
    
    b1 = tk.Button(text="add data", command=Insert)
    b1.pack(side=tk.BOTTOM)
    
    root.mainloop()
    

    【讨论】:

    • 当我用这个隐藏第一列时,例如(tree= ttk.Treeview(root, column=("column", "colunn1", "columns2"), show="headings"))行 ID 不显示在下方,但第一个条目出现在 NUMBER 下方,第二个条目出现在 First name 下方,姓氏为空。当我向其中插入数据时。
    • @OJOE 您使用的是“#0”、“#1”、“#2”还是“#1”、“#2”、“#3”列?因为我认为比在后面的问题中,解决方案是从“#0”、“#1”、“#2”切换到“#1”、“#2”、“#3”,这可能就是为什么answer 不再适用于您当前的代码。
    • 是的,我把它改成了“#0”
    • 我将其更改为“#1”、“#0”、“#2”,因为我在一个问题中提供了答案,然后我发现该行没有出现在它的列下.
    猜你喜欢
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    • 2022-12-08
    • 2020-02-11
    相关资源
    最近更新 更多