2017-01-26 1 views
0

인 ttk.combobox를 채우고 싶습니다. 약간의 문제가 있습니다. 도움이 필요합니다.이 문제는 python ttk.combobox 위젯과 관련되어 있습니다. 저는 일주일 전에 코딩을 시작한 python에 처음 입니다. 사용자 입력에 의해 채워지는 데이터베이스가 있습니다.이 데이터베이스는 사용자의 주식 입력 (예 : 항목, 비용, 공급 업체 등)을 저장합니다.이 부분은 할 수 있습니다.데이터베이스 쿼리 결과가

데이터베이스에서 'for'루프를 사용하여 데이터베이스 쿼리의 개별 항목을 ttk.combobox로 가져와 사용자가 선택할 수 있도록합니다. 그러나 내 문제는 매번 오류가 발생합니다. 내 데이터베이스 쿼리에서 내 항목 열 내의 모든 항목을 표시하는 콤보 박스가 필요합니다.

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

내가 그러나 자수성가 한 목록 를 사용하는 나는 경우는, 잘 작동, 난에 대한 예를 찾을 수 없습니다 :

온라인 소스에서

, 내가 ttk.combobox에 대한 예를 발견 파이썬에서 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() 
+0

()'행과 수동으로 표준 파이썬 목록을 작성하는 나중에 Combobox와 함께 사용할 수 있습니다. – furas

+1

첫 번째 규칙 : 항상 질문하기 FULL 오류 메시지 - 우리는 마음에 들지 않으며이 오류를보기 위해 코드를 실행할 수 없습니다. 그리고 FULL 메시지 (Traceback)를 써라. 마지막 텍스트뿐만 아니라 많은 유용한 정보를 얻을 수있다. – furas

+0

대단히 고마워, 여기에 새로운 것도 있는데, 필자의 후속 질문에 좋은 조언을 확실히 전할 것입니다. – Peter

답변

0

첫째, 당신은 기능 둘째

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

을 실행 ()을 잊었 : 내부 combo_input 당신이 return row 그래서 당신은 단지 첫 번째 행, 아무것도 더를 돌려 사용합니다.

모든 값을 가진 파이썬 목록을 작성한 다음 리턴해야합니다.

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 

편집 : 전체, 작업 예 :
그것은 같은 것을 할 수 있습니다 당신이 fetchall`에이

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

관련 문제