如何使用Sqlite填充Tkinter下拉列表?
这就是我所拥有的:
from tkinter import *
import sqlite3
root = Tk()
root.title('Testing Combobox, Listbox & Database')
db = sqlite3.connect('vehicles.db')
c = db.cursor()
# create Combobox
var = StringVar(root)
#var.set("") # initial value
# create Listbox
list = Listbox(root, width=50, height=20)
# Populate Listbox
query = c.execute('SELECT models FROM autos')
for i in query:
listitems.insert(END,i)
# INSERT LISTBOX INTO COMBOBOX? HOW?
options = OptionMenu(root, var, xxxxxxx).pack()
root.mainloop()
答案 0 :(得分:2)
我建议你使用一个组合框
list=Combobox(root, width=50, height=20)
list['values']=listitems
list.pack()
这对我有用。
虽然由于某种原因我必须明确导入ttk
from tkinter import ttk
list=ttk.Combobox(root, width=50, height=20)
list['values']=listitems
list.pack()
在完全填充“列表项目”之后输入此代码,即在' for循环之后
答案 1 :(得分:0)
更好的(或正确的方法)应该是删除:
listitems = Listbox(root)
listitems = query.fetchall()
并替换:
list['values']=listitems
与
list['values']=query.fetchall()
答案 2 :(得分:0)
这是完整的工作代码。 OP在评论中提出的建议几乎可以奏效,但我能做的最好的事情是将下拉列表中的值用大括号括起来。使用here改编的代码,我得出了OP试图做的完整工作代码。
import tkinter as tk
from tkinter import ttk
import sqlite3
def create_table():
conn = sqlite3.connect('vehicles.db')
cur = conn.cursor()
cur.execute("DROP TABLE IF EXISTS autos;") # use this line only if you want to overwrite existing table
cur.execute("CREATE TABLE IF NOT EXISTS autos ('models' TEXT, 'year' DATE);")
conn.commit()
cur.execute("INSERT INTO autos VALUES ('Ford Falcon', 1965);")
cur.execute("INSERT INTO autos VALUES ('Chevy BelAir', 1954);")
conn.commit()
cur.close()
conn.close()
def combo_values_input():
conn = sqlite3.connect('vehicles.db')
cur = conn.cursor()
query = cur.execute('SELECT models FROM autos')
data = []
for row in cur.fetchall():
data.append(row[0])
return data
cur.close()
conn.close()
root = tk.Tk()
root.title('Testing Tkinter Combobox with Sqlite')
create_table()
combo = ttk.Combobox(root, width=50, height=20)
combo.grid()
combo['values'] = combo_values_input()
root.mainloop()