我已经在Tkinter中建立了一个连接到Sqlite的列表框,并且具有连接到数据库的按钮命令的不同功能,这些命令工作正常(例如Add,Fetch,Save等)我执行时遇到的唯一控件我从数据库中获取数据库条目后,选择显示在我的列表框中的数据库条目。为简单起见,这是我目前的代码,仅用于获取和加载部分:
#Fetch all database records to display in listbox
def fetchRecord():
cont = sqlite3.connect('storagetest.db')
with cont:
cursort = cont.cursor()
list_loadr = cursort.execute('''SELECT name FROM content''')
list_load = list_loadr.fetchall()
for item in list_load:
list.insert(END, item)
cont.commit()
#Load is supposed to select content and insert into Entry field
def loadRecord():
cont = sqlite3.connect('test.db')
c = cont.cursor()
c.execute('SELECT * FROM content')
for item in c:
list.get(list.curselection())
cont.commit()
print ("select")
基本上,我无法在列表框中绑定(单个)选项并将其输出到输入框中。 shell输出没有错误,只有我的打印功能输出。我已经能够找到如何使用网格布局而不是包,但没有数据库连接。然而,我的gui几何,按钮和行的其余部分都是包几何布局。有谁知道在这种情况下连接和执行数据库是否甚至是必要的?我在这个问题上很失落,并且在使用Sqlite3和Tkinter方面没有看到很多资源。提前感谢您的帮助。
答案 0 :(得分:3)
上面的链接有助于引导正确的方向,我能够找到解决方案。它要求我转换为网格几何布局而不是包几何布局,以便在选择和返回文本条目时获得更多功能和模块性。选择列表项并在文本字段框中返回时,需要分离事件绑定。再次,确认Rolf所述的此功能不需要Sqlite数据库连接。
#Bind listbox selection into entry field
def get_list(event):
index = listbox1.curselection()[0]
seltext = listbox1.get(index)
enter1.delete(0, 50)
enter1.insert(0, seltext)
#Bind entry text into listbox
def set_list(event):
try:
index = listbox1.curselection()[0]
listbox1.delete(index)
except IndexError:
index = tk.END
listbox1.insert(index, enter1.get())
listbox1 = tk.Listbox(root, width=50, height=6)
listbox1.grid(row=0, column=0)
enter1 = tk.Entry(root, textvariable=source, width=50)
enter1.insert(0, 'Click on Fetch Button, then select item in the listbox')
enter1.grid(row=1, column=0)
enter1.bind('<Return>', set_list)
enter1.bind('<Double-1>', set_list)
listbox1.bind('<ButtonRelease-1>', get_list)
这个资源链接here是我想要实现的一个很好的例子(除了使用Sqlite数据库连接命令)。
答案 1 :(得分:1)
您尚未执行抓取,因此您没有数据 使用:
mydata = c.fetchone()
或
mydata = c.fetchall()
然后你可以说
for item in mydata:
对于记录,commit
语句仅用于提交对数据库的写入
没有关于Tkinter和sqlite3的信息的原因是因为它们没有任何关系。对sqlite3和python
的简单搜索将提供大量文档。
编辑1:在您的评论后澄清 您仍然需要在选择后进行提取。所以你的代码应该是这样的:
def loadRecord():
cont = sqlite3.connect('test.db')
c = cont.cursor()
c.execute('SELECT * FROM content')
mydata = c.fetchall()
for row in mydata:
list.get(row)
我已经很长时间没有使用过Tkinter了,所以我不确定list.get(row)
行,但不管它应该是什么,你都会加载来自&#34;提取的数据&# 34;数据即mydata
要在for
循环中提取单个数据项,请设置&#34;字典光标&#34;:
cont.row_factory = sqlite3.Row
然后您可以使用列名访问数据,如下所示:
for row in mydata:
print row['data_item1']
print row['data_item2']
其中data_item1和data_item2是数据库表中的名称(字段)
测试它尝试在for row in mydata
循环中打印mydata或行
最后,关于commit
声明,在这种情况下你不需要它。但是,您可以将数据库设置为自动提交,这样您就不必在打开数据库时设置isolation_level
来担心它们:
sqlite3.connect("mydatabase.db", isolation_level=None)