2017-08-01 90 views
0

我有一个数据库与客户表与字段(id,名称,姓氏,出生年份)。 我创建了一个显示名字和姓氏的树形视图,但是当我尝试将DOB插入到树形视图中时,出现错误列索引3越界。 也请你能解释一下treeview是如何实际工作的,因为我已经从教程中复制了代码并对其进行了修改,但仍未完全理解它。Python - tkinter - 树 - 数据库问题

from tkinter import * 
    from tkinter import ttk 
    import sqlite3 
    import os.path 

    class Product: 
db_name = 'database.db' 

def __init__(self, wind): 
    self.wind = wind 
    self.wind.title('IT Products') 

    frame = LabelFrame (self.wind, text = 'Add new record') 
    frame.grid (row = 0, column = 1) 

    Label (frame, text = 'Name: ').grid (row = 1, column = 1) 
    self.name = Entry (frame) 
    self.name.grid(row = 1, column = 2) 

    Label (frame, text = 'Surname: ').grid (row = 2, column = 1) 
    self.price = Entry (frame) 
    self.price.grid(row = 2, column = 2) 


    ttk.Button (frame, text= 'Add record', command = self.adding).grid (row = 3, column =2) 
    self.message = Label (text = '',fg = 'red') 
    self.message.grid (row = 3, column = 0) 




    self.tree = ttk.Treeview (height = 10, colum = 2) 
    self.tree.grid(row = 100, column = 0, columnspan = 100) 
    self.tree.heading('#0', text = 'Name', anchor = W) 
    self.tree.heading(2, text = 'Surname', anchor = W) 
    self.tree.heading(3, text = 'DOB', anchor = W) 
    self.tree.heading(3, text = "column B") 


    ttk.Button (text = 'Delete record', command = self.deleting).grid (row = 10, column = 5) 
    ttk.Button (text = 'Edit record').grid (row = 10, column = 1) 

    self.viewing_records() 


def run_query (self, query, parameters =()): 


    with sqlite3.connect(self.db_name) as conn: 
     cursor = conn.cursor() 
     query_result = cursor.execute (query, parameters) 
     conn.commit() 
    return query_result 


def viewing_records(self): 
    records = self.tree.get_children() 
    for element in records: 
     self.tree.delete (element) 
    query = 'SELECT * FROM customers ' 
    db_rows = self.run_query (query) 
    for row in db_rows: 
    ##   self.tree.insert('', 2, text=str(), values=(row[1], row[2], 
    row[3])) 

     self.tree.insert ('', 2, text = row[1], values=(row[1], row[2], row[3])) 

def validation(self): 
    return len (self.name.get()) != 0 and len (self.price.get()) != 0 

def adding (self): 

    if self.validation(): 
     query = 'INSERT INTO customersVALUES (NULL, ?, ?)' 
     parameters = (self.name.get(), self.price.get()) 
     self.run_query (query, parameters) 
     self.message['text'] = 'Record {} added'.format (self.name.get()) 
     self.name.delete (0, END) 
     self.price.delete (0,END) 
    else: 
     self.message['text'] = 'Name field or price is empty' 
     self.viewing_records() 


def deleting (self): 
    self.message ['text'] = '' 
    try: 
     self.tree.item(self.tree.selection()) [ 'values'] [0] 
    except IndexError as e: 
     self.message[text] = 'Please select record' 
     return 
    self. message['text'] = '' 
    name = self.tree.item(self.tree.selection())['text'] 
    query = 'DELETE FROM customers WHERE name = ?' 
    self.run_query(query, (name,)) 
    self.message['text'] = 'Record {} deleted'.format(name) 
    self.viewing_records() 





    if __name__ == '__main__': 
     wind = Tk() 
     application = Product (wind) 
     wind.mainloop() 
+0

拼错 “塔”,self.tree = ttk.Treeview(高度= 10,colum = 2),并且指定了具有2列的树视图,因此错误消息是正确的。最后,我们不知道“但是还没有完全理解”是什么意思。你想要弄清楚什么发生了什么? –

回答

0

为了避免列索引错误,提供列的标识符的列表,如下所示:

self.tree = ttk.Treeview(height=10, columns=("lname", "sex", "sdate", "dob")) 
    self.tree.grid(row=100, column=0, columnspan=100) 
    self.tree.heading('#0', text='First Name', anchor=W) 
    self.tree.heading("lname", text='Last Name', anchor=W) 
    self.tree.heading("sex", text='Gender', anchor=W) 
    self.tree.heading("sdate", text='Start Date', anchor=W) 
    self.tree.heading("dob", text='Birth Date', anchor=W) 

enter image description here

+0

Thnaks为您提供帮助。有种工作,但我得到一个额外的列是空白的。 tree = ttk.Treeview(height = 10,columns =(“Id”,“name”,“Surname”,“DOB”)) tree.grid(row = 100,column = 0,columnspan = 100) tree .heading('#0',text ='ID',anchor = W) tree.heading(“#1”,text ='name',anchor = W) tree.heading(“#2”,text = 'name',anchor = W) tree.heading(“#3”,text ='DOB',anchor = W) – maz86

+0

额外的列是由于Id ='Id','name' “姓氏”,“DOB”)。请将其更改为columns =(“name”,“Surname”,“DOB”)。 – ikolim