2016-03-30 3 views
0

Мне удалось обработать фрагмент кода, который по большей части выполняет то, что я хочу, чтобы он делал, за исключением того, что исходный код использовал список для вставки данных в дерево. Я хочу, чтобы данные, которые будут вставлены для вызова из таблицы SQL и выводятся в соответствующие столбцы. Мое кодирование до сих пор выглядит следующим образом:Вставка таблицы SQL в дерево

import tkinter as tk 
import tkinter.font as tkFont 
import tkinter.ttk as ttk 
import sqlite3 
class MultiColumnListbox(object): 
    """use a ttk.TreeView as a multicolumn ListBox""" 

    def __init__(self): 
     self.tree = None 
     self._setup_widgets() 
     self._build_tree() 

    def _setup_widgets(self): 
     s = """\click on header to sort by that column 
     to change width of column drag boundary 
     """ 
     msg = ttk.Label(wraplength="4i", justify="left", anchor="n", 
      padding=(10, 2, 10, 6), text=s) 
     msg.pack(fill='x') 
     container = ttk.Frame() 
     container.pack(fill='both', expand=True) 
     # create a treeview with dual scrollbars 
     self.tree = ttk.Treeview(columns=getvariablesC, show="headings") 
     vsb = ttk.Scrollbar(orient="vertical", 
      command=self.tree.yview) 
     hsb = ttk.Scrollbar(orient="horizontal", 
      command=self.tree.xview) 
     self.tree.configure(yscrollcommand=vsb.set, 
      xscrollcommand=hsb.set) 
     self.tree.grid(column=0, row=0, sticky='nsew', in_=container) 
     vsb.grid(column=1, row=0, sticky='ns', in_=container) 
     hsb.grid(column=0, row=1, sticky='ew', in_=container) 
     container.grid_columnconfigure(0, weight=1) 
     container.grid_rowconfigure(0, weight=1) 

    def _build_tree(self): 
     for col in getvariablesC: 
      self.tree.heading(col, text=col.title(), 
       command=lambda c=col: sortby(self.tree, c, 0)) 
      # adjust the column's width to the header string 
      self.tree.column(col, 
       width=tkFont.Font().measure(col.title())) 
    def sqlcode(): 
     db = sqlite3.connect('File') 
     cursor = db.cursor() 
     sql1="Select * FROM ProductTable" 
     cursor.execute(sql1) 
     result = cursor.fetchall() 
     count = (len(result)) 
     for item in result: 
      self.tree.insert('', 'end', values=item) 
      # adjust column's width if necessary to fit each value 
      for ix, val in enumerate(item): 
       col_w = tkFont.Font().measure(val) 
       if self.tree.column(getvariablesC[ix],width=None)<col_w: 
        self.tree.column(getvariablesC[ix], width=col_w) 
     cursor.close() 

    sqlcode() 

    getvariablesC= ["CustomerID","Title","Name","Address1","Address2","Town","County","PostCode","STDCode","HomeNo","MobileNo","Email","Source","Month","Year"] 


if __name__ == '__main__': 
    root = tk.Tk() 
    root.title("Multicolumn Treeview/Listbox") 
    listbox = MultiColumnListbox() 
    root.mainloop() 

Основная проблема, которую я имею что self не определяется, когда кодирование выполняется, но я не уверен, что это вызывает ошибку:

NameError: global name 'self' is not defined

+0

Похоже, ошибка линейного уровня. В вашем случае есть класс MultiColumnListbox и несколько независимых методов. Пожалуйста, добавьте пробелы (вкладку) перед методами для исправления отступа. –

+0

Похоже, что отступ недействителен. Это должно быть сейчас, спасибо, что указали это. – Coder101

ответ

2

Вы не указали self в определении функции. Вы должны изменить:

def sqlcode(): 

в

def sqlcode(self): 
+0

Я сделал эту настройку, но теперь она появляется с ошибкой 'NameError: name 'self' не определена' – Coder101

+0

вам нужно сохранить правильное' indentation' под своим классом. Для ex, числовые пробелы для 'def __init __ (self):' должны быть такими же, как 'def sqlcode (self):' – krishv

Смежные вопросы