2017-01-26 9 views
0

У меня есть небольшая проблема. Мне нужна помощь. Это касается python ttk.combobox widget Я новичок в python, только что начал кодирование неделю назад. У меня есть база данных, которая заполняется пользовательским вводом. Эта база данных предназначена для хранения входных данных пользователя (например, предметов, стоимости, поставщика и т. Д.). Эта часть, которую я смог сделать.Я хочу заполнить ttk.combobox результатами из запроса базы данных

Из базы данных я использую цикл 'for' для получения каждого отдельного элемента из моего запроса на базу данных в ttk.combobox, чтобы пользователь мог сделать выбор. Однако моя проблема в том, что я получаю сообщение об ошибке каждый раз. Я хочу, чтобы combobox отображал все элементы в столбце item из моего запроса к базе данных.

Из источников в Интернете, я выяснил пример ttk.combobox:

list = ['shoe', 'toy', 'bag'] 
    combobox = ttk.Combobox(root) 
    combobox['values'] = list 

Это прекрасно работает, если я использовать самодельный список Однако, я не могу найти пример ttk.combobox с использованием запроса от sqlite3 в python

Заранее благодарю вас за помощь в решении этой проблемы. Пример того, как это сделать и объяснение того, что я сделал неправильно, поможет мне много. Простите меня за плохо организованный стиль кодирования, я надеюсь, что с ним все будет лучше.

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() 
+0

вы должны 'fetchall()' строки и вручную создать стандартный список Python, который позже вы можете использовать с 'Combobox' – furas

+1

первое правило: всегда ставить под вопрос FULL сообщение об ошибке - мы не можем читать в вашем уме, и мы не можем запустить ваш код, чтобы увидеть эту ошибку. И поместите ПОЛНОЕ сообщение (Traceback) - может мне много полезной информации - не только последний текст. – furas

+0

Большое спасибо, новичок здесь, я бы определенно положил ваш совет на хорошее использование в моих последующих вопросах. – Peter

ответ

0

Первое: Вы забыли () выполнить функцию

self.comb['value'] = self.combo_input() 

Во-вторых, внутри combo_input вы используете return row так вы возвращаете только первую строку, ничего больше.

Вам нужно создать список Python со всеми значениями и затем вернуть его.
Это может быть что-то вроде этого:

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 

EDIT: полный, рабочий пример:

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() 
+0

Большое спасибо, я попробовал, и он работает. Спасибо еще раз. – Peter