如何使用 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()
请注意,您应该确保 data
和 listbox
同步。
我有 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()
请注意,您应该确保 data
和 listbox
同步。