所以基本上我有一个SQL数据库,其中包含5个不同的数据列。 我想做的是从SQL查询中获取数据并将其放入列表中,以便可以在tkinter的treeview小部件中显示它。

问题:

  1. 有没有更简单的方法可以从SQL表中获取数据并在tkinter中以table-like格式显示数据?如果可以,怎么办?

  2. 用tkinter在treeview小部件中创建表格是个好主意吗?

  3. 如果没有,我应该使用什么小部件?

我试图将我的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()