108 lines
4.1 KiB
Python
108 lines
4.1 KiB
Python
|
"""Demo based on the demo mclist included with tk source distribution."""
|
||
|
import Tkinter
|
||
|
import tkFont
|
||
|
import ttk
|
||
|
|
||
|
tree_columns = ("country", "capital", "currency")
|
||
|
tree_data = [
|
||
|
("Argentina", "Buenos Aires", "ARS"),
|
||
|
("Australia", "Canberra", "AUD"),
|
||
|
("Brazil", "Brazilia", "BRL"),
|
||
|
("Canada", "Ottawa", "CAD"),
|
||
|
("China", "Beijing", "CNY"),
|
||
|
("France", "Paris", "EUR"),
|
||
|
("Germany", "Berlin", "EUR"),
|
||
|
("India", "New Delhi", "INR"),
|
||
|
("Italy", "Rome", "EUR"),
|
||
|
("Japan", "Tokyo", "JPY"),
|
||
|
("Mexico", "Mexico City", "MXN"),
|
||
|
("Russia", "Moscow", "RUB"),
|
||
|
("South Africa", "Pretoria", "ZAR"),
|
||
|
("United Kingdom", "London", "GBP"),
|
||
|
("United States", "Washington, D.C.", "USD")
|
||
|
]
|
||
|
|
||
|
def sortby(tree, col, descending):
|
||
|
"""Sort tree contents when a column is clicked on."""
|
||
|
# grab values to sort
|
||
|
data = [(tree.set(child, col), child) for child in tree.get_children('')]
|
||
|
|
||
|
# reorder data
|
||
|
data.sort(reverse=descending)
|
||
|
for indx, item in enumerate(data):
|
||
|
tree.move(item[1], '', indx)
|
||
|
|
||
|
# switch the heading so that it will sort in the opposite direction
|
||
|
tree.heading(col,
|
||
|
command=lambda col=col: sortby(tree, col, int(not descending)))
|
||
|
|
||
|
class App(object):
|
||
|
def __init__(self):
|
||
|
self.tree = None
|
||
|
self._setup_widgets()
|
||
|
self._build_tree()
|
||
|
|
||
|
def _setup_widgets(self):
|
||
|
msg = ttk.Label(wraplength="4i", justify="left", anchor="n",
|
||
|
padding=(10, 2, 10, 6),
|
||
|
text=("Ttk is the new Tk themed widget set. One of the widgets it "
|
||
|
"includes is a tree widget, which can be configured to "
|
||
|
"display multiple columns of informational data without "
|
||
|
"displaying the tree itself. This is a simple way to build "
|
||
|
"a listbox that has multiple columns. Clicking on the "
|
||
|
"heading for a column will sort the data by that column. "
|
||
|
"You can also change the width of the columns by dragging "
|
||
|
"the boundary between them."))
|
||
|
msg.pack(fill='x')
|
||
|
|
||
|
container = ttk.Frame()
|
||
|
container.pack(fill='both', expand=True)
|
||
|
|
||
|
# XXX Sounds like a good support class would be one for constructing
|
||
|
# a treeview with scrollbars.
|
||
|
self.tree = ttk.Treeview(columns=tree_columns, 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 tree_columns:
|
||
|
self.tree.heading(col, text=col.title(),
|
||
|
command=lambda c=col: sortby(self.tree, c, 0))
|
||
|
# XXX tkFont.Font().measure expected args are incorrect according
|
||
|
# to the Tk docs
|
||
|
self.tree.column(col, width=tkFont.Font().measure(col.title()))
|
||
|
|
||
|
for item in tree_data:
|
||
|
self.tree.insert('', 'end', values=item)
|
||
|
|
||
|
# adjust columns lenghts if necessary
|
||
|
for indx, val in enumerate(item):
|
||
|
ilen = tkFont.Font().measure(val)
|
||
|
if self.tree.column(tree_columns[indx], width=None) < ilen:
|
||
|
self.tree.column(tree_columns[indx], width=ilen)
|
||
|
|
||
|
def main():
|
||
|
root = Tkinter.Tk()
|
||
|
root.wm_title("Multi-Column List")
|
||
|
root.wm_iconname("mclist")
|
||
|
|
||
|
import plastik_theme
|
||
|
try:
|
||
|
plastik_theme.install('~/tile-themes/plastik/plastik')
|
||
|
except Exception:
|
||
|
import warnings
|
||
|
warnings.warn("plastik theme being used without images")
|
||
|
|
||
|
app = App()
|
||
|
root.mainloop()
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
main()
|