【问题标题】:How to convert an SQL Output to a python list [closed]如何将 SQL 输出转换为 python 列表 [关闭]
【发布时间】:2020-06-13 04:13:33
【问题描述】:

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

问题:

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

  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()

对不起,奇怪的布局

【问题讨论】:

  • 向我们展示你的 python 代码
  • 总是把代码、错误信息和数据放在有问题的地方——这样会更易读。
  • 现在不行了
  • 我添加了完整的代码(不是太大)\
  • 顺便说一句:tkinter 没有用于表格的标准小部件。请参阅 pandastabletkintertable - 它们比 Treeview 更容易

标签: python sql sqlite tkinter


【解决方案1】:

这是一个最小的例子,它使用两个元素创建数据库,然后它使用数据库中的数据来填充 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, "bond@mi6.uk", "London")')
    cur.execute('INSERT INTO user (name, age, email, town) values("Rambo", 45, "rambo@usa.com", "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()

【讨论】:

  • 我尝试了您的代码并得到了这个“缺少”-text“的值”
  • 如果你已经有数据库那么你必须跳过create()。但是您可以移动(或删除)数据库文件以从新数据库开始。它创建数据库并添加两行,以便有数据显示它。
  • 非常感谢,它运作良好,对我的项目有帮助。我只需要弄清楚你是怎么做的,以防我需要类似的事情
  • 首先我在 Google SQL 中发现了它创建的表 - 我从来没有记住它。接下来我创建了INSERT 来显示一些数据。 fetchall() 总是返回带有行的列表,所以我总是使用 for-loop 来获取行并对这一行做一些事情。在其他情况下,我还会使用内部 for-loop 从行中获取项目,或者我会使用 len(row) 检查行中是否有足够的项目。当然,我一直使用print() 来查看变量中的检查值。有些模块具有将行作为字典返回的功能,所以我会使用 row["name"] (等)而不是 row[1] - 但我不记得函数。
  • 顺便说一句:在SELECT 之后,您可以使用print(cur.description) 或使用此模块print([col[0] for col in cur.description]) 在结果中查看列名称
猜你喜欢
  • 1970-01-01
  • 2021-11-21
  • 2019-02-26
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多