所以基本上我有一个SQL数据库,其中包含5个不同的数据列。 我想做的是从SQL查询中获取数据并将其放入列表中,以便可以在tkinter的treeview小部件中显示它。
问题:
有没有更简单的方法可以从SQL表中获取数据并在tkinter中以table-like格式显示数据?如果可以,怎么办?
用tkinter在treeview小部件中创建表格是个好主意吗?
如果没有,我应该使用什么小部件?
我试图将我的SQL输出转换为列表,但它不断给出类似于以下内容的错误:
list index out of range
这是我完整的代码:
from tkinter import *
from tkinter import messagebox
from tkinter import ttk
import sqlite3
#lst = ['apple', 'banana', 'strawberry', 'avo', 'rasberry']
con = sqlite3.connect("user_info.db")
cur = con.cursor()
root = Tk()
tv = ttk.Treeview(root)
tv.pack()
tv.config(columns= ("name", 'age', 'email', 'town'))
tv.heading('#0', text='ID')
tv.column('#0', width = 100)
tv.heading('1', text = "Age")
tv.column('1', width = 100)
tv.heading('name', text = 'Name')
tv.column('name', width = 100)
tv.heading('2', text = "email")
tv.column("2", width = 100)
tv.heading('3', text = "Town")
tv.column("3", width = 100)
cur.execute('SELECT * FROM user')
fr = cur.fetchall()
print(fr)c
print(cur)
tv.insert("",'0', 'item1', text = fr[0])
tv.set('item1', 'name', fr[1])
tv.set('item1', 'age', fr[2])
tv.set('item1', 'email', fr[3])
tv.set('item1', 'town', fr[4])
root.mainloop()
抱歉,布局怪异 谢谢ath0rus
分析解答
这是一个最小的示例,该示例创建具有两个元素的数据库,然后使用数据库中的数据填充Treeview
您只需使用create()
。
import tkinter as tk
from tkinter import ttk
import sqlite3
def create(con):
cur = con.cursor()
cur.execute('''CREATE TABLE IF NOT EXISTS user (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
age TEXT NOT NULL,
email TEXT NOT NULL UNIQUE,
town TEXT NOT NULL
);''')
cur.execute('INSERT INTO user (name, age, email, town) values("James Bond", 45, "[email protected]", "London")')
cur.execute('INSERT INTO user (name, age, email, town) values("Rambo", 45, "[email protected]", "Washington")')
con.commit()
# --- main ---
con = sqlite3.connect("user_info.db")
cur = con.cursor()
create(con)
root = tk.Tk()
tv = ttk.Treeview(root)
tv.pack(fill='both', expand=True)
tv.config(columns= ("name", 'age', 'email', 'town'))
tv.heading('#0', text='ID')
tv.column('#0', width = 100)
tv.heading('1', text = "Age")
tv.column('1', width = 100)
tv.heading('name', text = 'Name')
tv.column('name', width = 100)
tv.heading('2', text = "email")
tv.column("2", width = 100)
tv.heading('3', text = "Town")
tv.column("3", width = 100)
cur.execute('SELECT * FROM user')
for number, row in enumerate(cur.fetchall()):
print(row)
item = 'item{}'.format(number)
tv.insert("", 'end', item, text=row[0])
tv.set(item, 'name', row[1])
tv.set(item, 'age', row[2])
tv.set(item, 'email', row[3])
tv.set(item, 'town', row[4])
root.mainloop()