Display Listbox with columns using Tkinter?

前端 未结 3 1355
心在旅途
心在旅途 2020-12-04 13:46

I\'m trying to create a Listbox in Tkinter that has columns.

I\'m returning from a DB query records and would like to display each entry in it\'s own c

3条回答
  •  执笔经年
    2020-12-04 14:07

    You can use Ttk/Tkinker Treeview widget, which is used to work with tabular data.

    The following is an example of a class that uses a Treeview widget to display a multi-column list of strings:

    '''
    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)

    These are some pictures of the result of using a Treeview widget:

    enter image description here

提交回复
热议问题