使用Sqlite3连接将列表框选择加载到条目框中

时间:2015-10-17 04:18:02

标签: python sqlite tkinter listbox

我已经在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方面没有看到很多资源。提前感谢您的帮助。

2 个答案:

答案 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)