如何使用 Tkinter Listbox 小部件获取 SQLite 3 table 中列中一行的值?

How can I get the value of a row in a column in SQLite 3 table with Tkinter Listbox widget?

我有 Python 程序通过前端的 Tkinter 连接到 SQLite 3 数据库。我的数据库 table(主题列表)由三列组成:[id(唯一整数)、主题(文本)、serial(唯一整数)]。这是我的程序:

import sqlite3
from tkinter import *


conn = sqlite3.connect('database.db')
c = conn.cursor()
c.execute('SELECT COUNT() FROM subjectlist')
number = (c.fetchone()[0])

c.execute('SELECT * FROM subjectlist ORDER BY serial')
data = c.fetchall()
c.close
conn.close()


root = Tk()

listbox = Listbox(root)
listbox.pack()
for i in range(number):
    listbox.insert(END, data[i][1])

def get_serial():
    print(listbox.get(listbox.curselection()))

btn = Button(root, text="Show serial", command=lambda: get_serial())
btn.pack()

mainloop()

当前在运行时,当我单击列表框上的项目时( 基本上显示所有主题列值),然后按 Tkinter 按钮,我得到了我单击的主题。相反,我想获得与主题相对应的连续剧。请注意,主题列可能在两个或多个不同的行上具有相同的值。我将如何实现这一目标?

这里再举一个例子;如果我有这个 table:

我希望 GUI 首先显示列表框中的所有主题。然后我点击“猫”(在 id 第 3 行)然后我点击按钮,我希望程序打印我的序列号 4。

嗯,这应该也很容易。但是由于您的代码中有一个数据库,我目前无法用它进行测试,所以我做了一些假设。试试这个:

def get_letter():
    conn = sqlite3.connect('database.db')
    c = conn.cursor()
    ids = listbox.curselection()[0]+1 # Getting the index number starting from 1
    c.execute('SELECT * FROM subjectlist WHERE `id`=?;',(ids,)) # Searching the database for items with selected items index
    rows = c.fetchall()
    print(rows[0]) # Print the first and hopefully the only item in the list
    conn.close() # Close the connection

这应该打印与id对应的行,因为通常id是一个唯一的数字,它只会打印出一行。我还假设您的数据库和列表框的顺序相同,否则这可能不起作用。

您可以使用 listbox 中的项目索引从 data 中获取 serial:

import sqlite3
from tkinter import *

conn = sqlite3.connect('database.db')
c = conn.cursor()
c.execute('SELECT * FROM subjectlist ORDER BY serial')
data = c.fetchall()
c.close()
conn.close()


root = Tk()

listbox = Listbox(root)
listbox.pack()

for rec in data:
    listbox.insert(END, rec[1])

def get_serial():
    selected = listbox.curselection()
    if selected:
        idx = selected[0]
        print(data[idx][2]) # print serial of selected item

btn = Button(root, text="Show serial", command=get_serial)
btn.pack()

mainloop()

请注意,您应该确保 datalistbox 同步。