我正在使用 SQLite3、Python 和 Tkinter 处理具有“.sqlite”扩展名的数据库。我创建了一个函数来在程序启动时使用带有文本小部件的类似电子表格的界面显示整个数据库:
import tkinter as tk
import sqlite3
conn = sqlite3.connect('duff1.sqlite')
c = conn.cursor()
# Creating root
root = tk.Tk()
root.title('Table')
# make frame
frame0 = tk.Frame(root, bd=2)
# make display canvas
dpcanvas = tk.Canvas(frame0)
# make display frame
displayframe = tk.Frame(dpcanvas, bd=2, relief=tk.SUNKEN)
def pdp():
data = fetch()
for index, dat in enumerate(data):
t0 = tk.Text(displayframe, height=1, width=13, relief=tk.SOLID, bd=1, font='helvetica 11')
t0.insert(tk.END, dat[0])
t0.grid(row = index + 1, column = 0, sticky = tk.W)
t1 = tk.Text(displayframe, height=1, width=13, relief=tk.SOLID, bd=1, font='helvetica 11')
t1.insert(tk.END, dat[1])
t1.grid(row = index + 1, column = 1, sticky = tk.W)
t2 = tk.Text(displayframe, height=1, width=13, relief=tk.SOLID, bd=1, font='helvetica 11')
t2.insert(tk.END, dat[2])
t2.grid(row=index + 1, column = 2, sticky=tk.W)
t3 = tk.Text(displayframe, height=1, width=13, relief=tk.SOLID, bd=1, font='helvetica 11')
t3.insert(tk.END, dat[3])
t3.grid(row=index + 1, column=3, sticky=tk.W)
t4 = tk.Text(displayframe, height=1, width=13, relief=tk.SOLID, bd=1, font='helvetica 11')
t4.insert(tk.END, dat[4])
t4.grid(row=index + 1, column=4, sticky=tk.W)
t5 = tk.Text(displayframe, height=1, width=13, relief=tk.SOLID, bd=1, font='helvetica 11')
t5.insert(tk.END, dat[5])
t5.grid(row=index + 1, column=5, sticky=tk.W)
t6 = tk.Text(displayframe, height=1, width=13, relief=tk.SOLID, bd=1, font='helvetica 11')
t6.insert(tk.END, dat[6])
t6.grid(row=index + 1, column=6, sticky=tk.W)
t7 = tk.Text(displayframe, height=1, width=13, relief=tk.SOLID, bd=1, font='helvetica 11')
t7.insert(tk.END, dat[7])
t7.grid(row=index + 1, column=7, sticky=tk.W)
t8 = tk.Text(displayframe, height=1, width=13, relief=tk.SOLID, bd=1, font='helvetica 11')
t8.insert(tk.END, dat[8])
t8.grid(row=index + 1, column=8, sticky=tk.W)
t9 = tk.Text(displayframe, height=1, width=13, relief=tk.SOLID, bd=1, font='helvetica 11')
t9.insert(tk.END, dat[9])
t9.grid(row=index + 1, column=9, sticky=tk.W)
t10 = tk.Text(displayframe, height=1, width=13, relief=tk.SOLID, bd=1, font='helvetica 11')
t10.insert(tk.END, dat[10])
t10.grid(row=index + 1, column=10, sticky=tk.W)
t11 = tk.Text(displayframe, height=1, width=13, relief=tk.SOLID, bd=1, font='helvetica 11')
t11.insert(tk.END, dat[11])
t11.grid(row=index + 1, column=11, sticky=tk.W)
t12 = tk.Text(displayframe, height=1, width=13, relief=tk.SOLID, bd=1, font='helvetica 11')
t12.insert(tk.END, dat[12])
t12.grid(row=index + 1, column=12, sticky=tk.W)
t13 = tk.Text(displayframe, height=1, width=13, relief=tk.SOLID, bd=1, font='helvetica 11')
t13.insert(tk.END, dat[13])
t13.grid(row=index + 1, column=13, sticky=tk.W)
t14 = tk.Text(displayframe, height=1, width=13, relief=tk.SOLID, bd=1, font='helvetica 11')
t14.insert(tk.END, dat[14])
t14.grid(row=index + 1, column=14, sticky=tk.W)
def fetch():
c.execute("SELECT * FROM 'duff'")
return c.fetchall()
pdp()
frame0.pack(side=tk.LEFT, anchor='nw', fill=tk.BOTH, expand=tk.YES)
displayframe.pack(side=tk.LEFT, anchor='nw', fill=tk.BOTH, expand=tk.YES)
dpcanvas.pack(side=tk.LEFT, anchor='nw', fill=tk.Y, expand=2)
displayframe.update_idletasks()
dpcanvas.create_window((4, 4), window=displayframe, anchor='nw')
# main loop
root.mainloop()
它似乎可以很好地处理大约 500 行 - 虽然需要几分钟才能加载 - 但我正在使用比这大得多的数据库。例如,一个有 500 行的数据库需要 3 分钟来加载;一个 1600 大约需要 16 个,关闭时 python 应用程序崩溃。
我的代码效率太低了吗?tkinter 的工作方式有问题吗?我记得曾经使用标签和代码运行速度更快地完成了类似的操作,但是我需要使用文本,因为我希望用户能够在框内“导航”,这些框有时有十几行左右,每行有几个字符.
我正在寻找我的问题的答案,表明 Python 2.7 中的 sqlite 版本特别慢,但是我使用的是 python 3.6.1 以及它附带的 SQLite 和 Tkinter 版本。
我阅读了另一个可能的答案,其中涉及创建可以加快查询速度的索引,但我还没有到达那部分。