# an alternative way to draw the tree--tree roots start towards the # left instead of being centered above children (run me to see how) from Tkinter import * import treeview_subclass from treeview_subclass import Rowsz, Colsz class TreeViewer(treeview_subclass.TreeViewer): def _drawLevels(self, levels, maxrow): rowpos = 0 for level in levels: colpos = 0 for (node, parent) in level: if node != None: text = self._label(node) if self._value(node): text = text + '=' + self._value(node) win = Label(self.canvas, text=text, bg=self.fg, bd=3, relief=RAISED) win.pack() self.canvas.create_window(colpos, rowpos, anchor=NW, window=win, width=Colsz*.5, height=Rowsz*.5) if parent != None: self.canvas.create_line( parent.__colpos + Colsz*.25, # from x-y, to x-y parent.__rowpos + Rowsz*.5, colpos, rowpos, arrow='last') node.__rowpos = rowpos node.__colpos = colpos # mark node, private attrs colpos = colpos + Colsz rowpos = rowpos + Rowsz if __name__ == '__main__': from PP2E.Dstruct.Classics import btree class BinaryTree(btree.BinaryTree): def __init__(self, viewer): btree.BinaryTree.__init__(self) self.viewer = viewer def view(self): self.viewer.drawTree(self.tree) class BinaryTreeViewer(TreeViewer): def _children(self, node): try: return [node.left, node.right] except: return None def _label(self, node): try: return str(node.data) except: return str(node) def test1(): t = BinaryTree(viewer) for i in [3, 1, 9, 2, 7]: t.insert(i) t.view() def test2(): t = BinaryTree(viewer) for c in 'badce': t.insert(c) viewer.drawTree(t.tree) def test3(): t = BinaryTree(viewer) for c in 'abcde': t.insert(c) t.view() root = Tk() viewer = BinaryTreeViewer(root) Button(root, text='test1', command=test1).pack(side=LEFT) Button(root, text='test2', command=test2).pack(side=LEFT) Button(root, text='test3', command=test3).pack(side=LEFT) root.mainloop()