我想用数据库查询的结果填充 ttk.combobox
I want to populate a ttk.combobox with results from database query
我有一个小问题,我需要帮助 with.This 关注点 python ttk.combobox 小部件
我是 python 的新手,一周前才开始编码。
我有一个由用户填充的数据库 input.This 数据库用于存储用户的库存输入(例如项目、成本、供应商等)。这部分我已经能够做到。
从数据库中,我使用 'for' 循环将每个单独的项目从我的数据库查询中获取到 ttk.combobox 中,以便用户可以进行选择。
但是我的问题是,我每次都会出错。
我希望组合框显示我的数据库查询中项目列中的所有项目。
从在线资源中,我找到了 ttk.combobox 的示例:
list = ['shoe', 'toy', 'bag']
combobox = ttk.Combobox(root)
combobox['values'] = list
如果我要使用自制列表,这很好用
但是,我无法在 python
中使用来自 sqlite3 的查询找到 ttk.combobox 的示例
预先感谢您帮助我解决这个问题。
一个如何做的例子以及对我做错了什么的解释将对我有很大帮助。
请原谅我的编码风格,我希望随着时间的推移变得更好。
from tkinter import *
from tkinter import ttk
import sqlite3
class Example:
def __init__(self,master):
self.master = master
self.win_label = Label(master, text="New Stock Entry")
self.win_label.grid(row=0, columnspan=2,)
self.item_label = Label(master, text="Item Name", fg='black')
self.item_label.grid(row=1, column=0, sticky=W, padx=5, pady=5)
self.unitprice_lab = Label(master, text="Unit Price", fg='black')
self.unitprice_lab.grid(row=2, column=0, sticky=W, padx=5, pady=5)
self.total_price = Label(master, text="Total Price", fg='black')
self.total_price.grid(row=3, column=0, sticky=W, padx=5, pady=5)
self.quantity_lab = Label(master, text="Quantity", fg='black')
self.quantity_lab.grid(row=4, column=0, sticky=W, padx=5, pady=5)
self.manufacturer_lab = Label(master,text="Manufacturer", fg='black')
self.manufacturer_lab.grid(row=5, column=0, sticky=W, padx=5, pady=5)
############### Variables to store input ################
self.item = StringVar()
self.unitp = IntVar()
self.unitn = IntVar()
self.quantity = IntVar()
self.man = StringVar()
############ Widgets############
self.item_entry = Entry(master, width=25,textvariable=self.item)
self.item_entry.grid(row=1, column=1, padx=5, pady=5)
self.unitprice_entry = Entry(master, width=25,textvariable=self.unitp)
self.unitprice_entry.grid(row=2, column=1, sticky=W, padx=5, pady=5)
self.total_price_entry = Entry(master,width=25,textvariable=self.unitn)
self.total_price_entry.grid(row=3, column=1, sticky=W, padx=5, pady=5)
self.quantity_entry = Entry(master,width=25,textvariable=self.quantity)
self.quantity_entry.grid(row=4, column=1, sticky=W, padx=5, pady=5)
self.manufacturer_entry = Entry(master, width=25,textvariable=self.man)
self.manufacturer_entry.grid(row=5, column=1, sticky=W, padx=5, pady=5)
# button for save
self.button_save = Button(master,text="Save",command= self.insert_Dbs)
self.button_save.grid(row=6, column=1, pady=15, padx=10, sticky=W)
def second_window(self): # Second Window to allow user selection
t = Toplevel()
t.geometry('350x290')
t.title('Student Input')
############# widgets ###############
self.label1 = ttk.Label(t, text = 'Student Name')
self.label1.grid(row =0 , column =0)
self.label2 = ttk.Label(t, text='Item Collected')
self.label2.grid(row=0, column=1)
self.label3 = ttk.Label(t, text='Quantity')
self.label3.grid(row=0, column=2)
self.entry1 =ttk.Entry(t, width = 20)
self.entry1.grid(row =1 , column =0)
self.entry2 = ttk.Entry(t, width=20)
self.entry2.grid(row=1, column=2)
self.comb = ttk.Combobox(t,width = 15).grid(row =1 , column =1)
self.comb['value'] = self.combo_input
def insert_Dbs(self): # Function to insert input into database
self.a1 = self.item.get()
self.a2 = self.unitp.get()
self.a3 = self.unitn.get()
self.a4 = self.quantity.get()
self.a5 = self.man.get()
#db = sqlite3.connect('stockdbExample.db')
'''db.execute('create table stocks (item text '
', item_uprice integer,'
' item_nprice integer,'
' quantity integer,'
' manufacturer text )')'''
db = sqlite3.connect('stockdbExample.db')
db.execute('insert into stocks (item,'
' item_uprice,'
' item_nprice,'
' quantity,'
' manufacturer) values (?, ?, ?, ?,?)',
(self.a1, self.a2, self.a3, self.a4, self.a5))
db.commit()
self.combo_input()
self.second_window()
def combo_input(self):
db = sqlite3.connect('stockdbExample.db')
cursor = db.execute('select item from stocks')
for row in cursor.fetchall():
return row
root = Tk()
c = Example(root)
root.mainloop()
第一:你忘记了()
执行函数
self.comb['value'] = self.combo_input()
第二:在 combo_input
里面你使用 return row
所以你 return 只有第一行,仅此而已。
您必须创建包含所有值的 Python 列表,然后 return 它。
它可以是这样的:
def combo_input(self):
db = sqlite3.connect('stockdbExample.db')
cursor = db.execute('select item from stocks')
result = []
for row in cursor.fetchall():
result.append(row[0])
return result
编辑:完整的工作示例:
import tkinter as tk
import tkinter.ttk as ttk
import sqlite3
class Example:
def __init__(self,master):
self.master = master
self.db = sqlite3.connect('stockdbExample.db')
# use only once
self.create_db()
self.cb = ttk.Combobox(master)
self.cb.pack()
self.cb['values'] = self.combo_input()
def combo_input(self):
cursor = self.db.cursor()
cursor.execute('SELECT item FROM stocks')
data = []
for row in cursor.fetchall():
data.append(row[0])
return data
def create_db(self):
cursor = self.db.cursor()
cursor.execute('CREATE TABLE stocks (item text)')
cursor.execute('INSERT INTO stocks (item) VALUES("Hello")')
cursor.execute('INSERT INTO stocks (item) VALUES("World")')
cursor.execute('INSERT INTO stocks (item) VALUES("Tkinter")')
cursor.close()
self.db.commit()
root = tk.Tk()
Example(root)
root.mainloop()
我有一个小问题,我需要帮助 with.This 关注点 python ttk.combobox 小部件 我是 python 的新手,一周前才开始编码。 我有一个由用户填充的数据库 input.This 数据库用于存储用户的库存输入(例如项目、成本、供应商等)。这部分我已经能够做到。
从数据库中,我使用 'for' 循环将每个单独的项目从我的数据库查询中获取到 ttk.combobox 中,以便用户可以进行选择。 但是我的问题是,我每次都会出错。 我希望组合框显示我的数据库查询中项目列中的所有项目。
从在线资源中,我找到了 ttk.combobox 的示例:
list = ['shoe', 'toy', 'bag']
combobox = ttk.Combobox(root)
combobox['values'] = list
如果我要使用自制列表,这很好用 但是,我无法在 python
中使用来自 sqlite3 的查询找到 ttk.combobox 的示例预先感谢您帮助我解决这个问题。 一个如何做的例子以及对我做错了什么的解释将对我有很大帮助。 请原谅我的编码风格,我希望随着时间的推移变得更好。
from tkinter import *
from tkinter import ttk
import sqlite3
class Example:
def __init__(self,master):
self.master = master
self.win_label = Label(master, text="New Stock Entry")
self.win_label.grid(row=0, columnspan=2,)
self.item_label = Label(master, text="Item Name", fg='black')
self.item_label.grid(row=1, column=0, sticky=W, padx=5, pady=5)
self.unitprice_lab = Label(master, text="Unit Price", fg='black')
self.unitprice_lab.grid(row=2, column=0, sticky=W, padx=5, pady=5)
self.total_price = Label(master, text="Total Price", fg='black')
self.total_price.grid(row=3, column=0, sticky=W, padx=5, pady=5)
self.quantity_lab = Label(master, text="Quantity", fg='black')
self.quantity_lab.grid(row=4, column=0, sticky=W, padx=5, pady=5)
self.manufacturer_lab = Label(master,text="Manufacturer", fg='black')
self.manufacturer_lab.grid(row=5, column=0, sticky=W, padx=5, pady=5)
############### Variables to store input ################
self.item = StringVar()
self.unitp = IntVar()
self.unitn = IntVar()
self.quantity = IntVar()
self.man = StringVar()
############ Widgets############
self.item_entry = Entry(master, width=25,textvariable=self.item)
self.item_entry.grid(row=1, column=1, padx=5, pady=5)
self.unitprice_entry = Entry(master, width=25,textvariable=self.unitp)
self.unitprice_entry.grid(row=2, column=1, sticky=W, padx=5, pady=5)
self.total_price_entry = Entry(master,width=25,textvariable=self.unitn)
self.total_price_entry.grid(row=3, column=1, sticky=W, padx=5, pady=5)
self.quantity_entry = Entry(master,width=25,textvariable=self.quantity)
self.quantity_entry.grid(row=4, column=1, sticky=W, padx=5, pady=5)
self.manufacturer_entry = Entry(master, width=25,textvariable=self.man)
self.manufacturer_entry.grid(row=5, column=1, sticky=W, padx=5, pady=5)
# button for save
self.button_save = Button(master,text="Save",command= self.insert_Dbs)
self.button_save.grid(row=6, column=1, pady=15, padx=10, sticky=W)
def second_window(self): # Second Window to allow user selection
t = Toplevel()
t.geometry('350x290')
t.title('Student Input')
############# widgets ###############
self.label1 = ttk.Label(t, text = 'Student Name')
self.label1.grid(row =0 , column =0)
self.label2 = ttk.Label(t, text='Item Collected')
self.label2.grid(row=0, column=1)
self.label3 = ttk.Label(t, text='Quantity')
self.label3.grid(row=0, column=2)
self.entry1 =ttk.Entry(t, width = 20)
self.entry1.grid(row =1 , column =0)
self.entry2 = ttk.Entry(t, width=20)
self.entry2.grid(row=1, column=2)
self.comb = ttk.Combobox(t,width = 15).grid(row =1 , column =1)
self.comb['value'] = self.combo_input
def insert_Dbs(self): # Function to insert input into database
self.a1 = self.item.get()
self.a2 = self.unitp.get()
self.a3 = self.unitn.get()
self.a4 = self.quantity.get()
self.a5 = self.man.get()
#db = sqlite3.connect('stockdbExample.db')
'''db.execute('create table stocks (item text '
', item_uprice integer,'
' item_nprice integer,'
' quantity integer,'
' manufacturer text )')'''
db = sqlite3.connect('stockdbExample.db')
db.execute('insert into stocks (item,'
' item_uprice,'
' item_nprice,'
' quantity,'
' manufacturer) values (?, ?, ?, ?,?)',
(self.a1, self.a2, self.a3, self.a4, self.a5))
db.commit()
self.combo_input()
self.second_window()
def combo_input(self):
db = sqlite3.connect('stockdbExample.db')
cursor = db.execute('select item from stocks')
for row in cursor.fetchall():
return row
root = Tk()
c = Example(root)
root.mainloop()
第一:你忘记了()
执行函数
self.comb['value'] = self.combo_input()
第二:在 combo_input
里面你使用 return row
所以你 return 只有第一行,仅此而已。
您必须创建包含所有值的 Python 列表,然后 return 它。
它可以是这样的:
def combo_input(self):
db = sqlite3.connect('stockdbExample.db')
cursor = db.execute('select item from stocks')
result = []
for row in cursor.fetchall():
result.append(row[0])
return result
编辑:完整的工作示例:
import tkinter as tk
import tkinter.ttk as ttk
import sqlite3
class Example:
def __init__(self,master):
self.master = master
self.db = sqlite3.connect('stockdbExample.db')
# use only once
self.create_db()
self.cb = ttk.Combobox(master)
self.cb.pack()
self.cb['values'] = self.combo_input()
def combo_input(self):
cursor = self.db.cursor()
cursor.execute('SELECT item FROM stocks')
data = []
for row in cursor.fetchall():
data.append(row[0])
return data
def create_db(self):
cursor = self.db.cursor()
cursor.execute('CREATE TABLE stocks (item text)')
cursor.execute('INSERT INTO stocks (item) VALUES("Hello")')
cursor.execute('INSERT INTO stocks (item) VALUES("World")')
cursor.execute('INSERT INTO stocks (item) VALUES("Tkinter")')
cursor.close()
self.db.commit()
root = tk.Tk()
Example(root)
root.mainloop()