使用Sqlite3连接将列表框选择加载到输入框中

2024-10-14 12:07:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Tkinter中建立了一个连接到Sqlite的listbox,并通过连接到数据库的按钮命令实现了不同的功能(例如Add、Fetch、Save等)。我在执行时遇到的唯一困难是在我从数据库获取数据后选择显示在列表框中的数据库条目。为了简单起见,以下是我当前的代码,仅用于Fetch和Load部分:

#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没有输出错误,只有我上面的print函数输出。我已经找到了如何使用网格布局而不是pack,但是没有数据库连接。但是我的gui几何图形的其余部分、按钮和行都在packgeometry布局中。有人知道在这种情况下是否有必要连接和执行数据库?我对这一点很迷茫,也没有看到很多关于使用Sqlite3和Tkinter的资源。提前谢谢你的帮助。在


Tags: toin数据库tkinterdefloadfetchcontent
2条回答

上面的链接有助于我们朝着正确的方向前进,我找到了解决办法。它要求我转换成一个网格几何布局,而不是一个包几何布局,以获得更多的功能和模块选择和返回文本条目。在选择一个列表项并在文本字段框中返回它时,需要分离事件绑定。再次,确认Sqlite数据库连接不是Rolf上面所述的此功能所必需的。在

#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 db connection命令)。在

您尚未执行回迁,因此没有数据。
使用:

mydata = c.fetchone()

或者

^{pr2}$

然后你可以说

for item in mydata:

对于记录,commit语句仅用于提交对数据库的写入。
没有关于Tkinter和sqlite3的信息的原因是它们没有关系。简单搜索sqlite3和python将提供大量文档。在

编辑1:在您的评论后澄清
您仍然需要在select之后执行一个fetch。所以你的代码应该是这样的:

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)行,但是不管它应该是什么,您都将从“获取的”数据加载数据,即mydata
要拉出for循环中的各个数据项,请设置“dictionary cursor”:

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)

相关问题 更多 >