diff options
author | Guilherme Polo <ggpolo@gmail.com> | 2009-01-28 15:56:01 (GMT) |
---|---|---|
committer | Guilherme Polo <ggpolo@gmail.com> | 2009-01-28 15:56:01 (GMT) |
commit | 4eae07844803880d0b57144708dca8889db511e8 (patch) | |
tree | 37c535ace0c05e7db9e25acc95e9c8059d03cbc1 /Demo/tkinter/ttk/treeview_multicolumn.py | |
parent | cda93aafde744df8006950c13e9893f29a747c31 (diff) | |
download | cpython-4eae07844803880d0b57144708dca8889db511e8.zip cpython-4eae07844803880d0b57144708dca8889db511e8.tar.gz cpython-4eae07844803880d0b57144708dca8889db511e8.tar.bz2 |
Demos for ttk added.
Diffstat (limited to 'Demo/tkinter/ttk/treeview_multicolumn.py')
-rw-r--r-- | Demo/tkinter/ttk/treeview_multicolumn.py | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/Demo/tkinter/ttk/treeview_multicolumn.py b/Demo/tkinter/ttk/treeview_multicolumn.py new file mode 100644 index 0000000..e0edc4f --- /dev/null +++ b/Demo/tkinter/ttk/treeview_multicolumn.py @@ -0,0 +1,107 @@ +"""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() |