On 2019-06-19 23:50, Rich Shepard wrote:
In a database application I want to design a view for the table rows
returned from a select statement. Tkinter has a listbox widget and web
searches suggest that multicolumn listboxes are best based on ttk.Treeview
widgets, but my understanding of a treeview is to display a hierarchical set
rather than a simple list.
Each table has multiple columns and I want to create a view for each table
that will allow the user to select a row. The SQL select statement will be
formed from criteria provided in a separate dialog box.
Here's a small example.
#!python3.7
# -*- coding: utf-8 -*-
#
# Example demonstrating a multi-column table using ttk.Treeview and
scrollbars.
#
import tkinter as tk
import tkinter.ttk as ttk
class TableExample(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.title('Table example')
headings = ['English', 'Experanto']
self.grid_rowconfigure(0, weight=1)
self.grid_rowconfigure(1, weight=0)
self.grid_columnconfigure(0, weight=1)
self.grid_columnconfigure(1, weight=0)
vscrollbar = tk.Scrollbar(self, orient='vertical')
vscrollbar.grid(row=0, column=1, sticky='ns')
hscrollbar = tk.Scrollbar(self, orient='horizontal')
hscrollbar.grid(row=1, column=0, sticky='we')
self.column_ids = ['#%d' % h for h in range(1, len(headings) + 1)]
def fix_map(option):
# Fix for setting text colour for Tkinter 8.6.9
# From: https://core.tcl.tk/tk/info/509cafafae
#
# Returns the style map for 'option' with any styles
starting with
# ('!disabled', '!selected', ...) filtered out.
# style.map() returns an empty list for missing options, so
this
# should be future-safe.
return [elm for elm in style.map('Treeview',
query_opt=option) if
elm[:2] != ('!disabled', '!selected')]
style = ttk.Style()
style.map('Treeview', foreground=fix_map('foreground'),
background=fix_map('background'))
self._table = ttk.Treeview(self, columns=self.column_ids,
displaycolumns='#all', show=['headings'],
yscrollcommand=vscrollbar.set, xscrollcommand=hscrollbar.set)
self._table.grid(row=0, column=0, sticky='nswe')
for id, heading in zip(self.column_ids, headings):
self._table.heading(id, text=heading)
vscrollbar.config(command=self._table.yview)
hscrollbar.config(command=self._table.xview)
# Now to fill the table.
words = [
('zero', 'nul'),
('one', 'unu'),
('two', 'du'),
('three', 'tri'),
('four', 'kvar'),
('five', 'kvin'),
]
for row in words:
# Add a new row.
row_id = self._table.insert('', 'end')
# Fill the new row.
for column_id, entry in zip(self.column_ids, row):
self._table.set(row_id, column_id, entry)
TableExample().mainloop()
--
https://mail.python.org/mailman/listinfo/python-list