¿Mostrar cuadro de lista con columnas usando Tkinter?

Estoy tratando de crear un Listbox de Listbox en Tkinter que tiene columnas.

Regreso de los registros de una consulta de base de datos y me gustaría mostrar cada entrada en su propia columna para cada registro.

En cuanto a Listbox , siento que debería haber esta funcionalidad allí pero no puedo encontrarla. ¿Qué widget debo usar para hacer esto? He estado buscando en línea, pero la documentación ha sido muy escasa.

Utilizando TkTreectrl :

 import Tkinter as tk import TkTreectrl as treectrl import sqlite3 def setup_table(connection): cursor=connection.cursor() cursor.execute('''CREATE TABLE foo (id INTEGER PRIMARY KEY AUTOINCREMENT, bar TEXT)''') sql='INSERT INTO foo (bar) values (?)' for i in range(10): cursor.execute(sql,(i,)) cursor.execute(sql,(u'\N{INFINITY}',)) def select_cmd(selected): print 'Selected items:', selected def main(): connection=sqlite3.connect(':memory:') setup_table(connection) cursor=connection.cursor() root = tk.Tk() root.title('Simple MultiListbox demo') mlb = treectrl.MultiListbox(root) mlb.pack(side='top', fill='both', expand=1) tk.Button(root, text='Close', command=root.quit).pack(side='top', pady=5) mlb.focus_set() mlb.configure(selectcmd=select_cmd, selectmode='extended') mlb.config(columns=('Column 1', 'Column 2')) cursor.execute('SELECT * from foo') for row in cursor.fetchall(): mlb.insert('end',*map(unicode,row)) root.mainloop() if __name__=='__main__': main() 

rendimientos

introduzca la descripción de la imagen aquí

Puede utilizar el widget Tev / Tkinker Treeview , que se utiliza para trabajar con datos tabulares.

El siguiente es un ejemplo de una clase que utiliza un widget de vista en Treeview para mostrar una lista de cadenas de varias columnas:

 ''' Here the TreeView widget is configured as a multi-column listbox with adjustable column width and column-header-click sorting. ''' try: import Tkinter as tk import tkFont import ttk except ImportError: # Python 3 import tkinter as tk import tkinter.font as tkFont import tkinter.ttk as ttk 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=car_header, 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 car_header: 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())) for item in car_list: 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(car_header[ix],width=None) 

Estas son algunas imágenes del resultado de usar un widget de Treeview :

introduzca la descripción de la imagen aquí

Una solución simple es usar dos cuadros de lista uno al lado del otro. No hay magia real, solo tiene que hacer un poco de trabajo adicional para obtener una barra de desplazamiento para controlar ambos (fácil de hacer) y tener la selección en los dos sincronizados (también se hace fácilmente).