Need help with oo design while using TreeWidget

Borivoj sorry.no at can.do
Wed Jul 15 08:15:53 EDT 2009


I'm looking for objective oriented and pythonic way to solve my problem.

I'm using IDLE's TreeWidget, by inheriting TreeItem and overriding some of 
it's methods. My tree structure is defined inside treedata, which is 
xml.dom.minidom object. MenuTreeFrame is responsible for displaying the 
widget inside it's own Frame. As you can see in the source, MyTreeItem is 
one child in tree, and it's method GetSubList is responsible for creating 
it's children TreeItems.

When creating each child, I have to pass original tree structure (treedata) 
to each child. Once I implement event firing, I will have to pass Event 
reference to each child as well. There has to be a better way to make these 
references available to each child in tree. What would you recommend?

My code looks something like this (not executable, because treedata 
definition is lacking):

import Tkinter as tk
from TreeWidget import TreeItem, TreeNode, ScrolledCanvas

class MenuTreeFrame(tk.Frame):
    def __init__(self, parent, treedata):
        tk.Frame.__init__(self, parent)
        self.treedata = treedata
        sc = ScrolledCanvas(self, bg='white', width=150, 
highlightthickness=0, takefocus=1)
        self.canvas = sc.canvas
        sc.frame.pack(fill="both", expand=1)
    def update(self, dom):
        self.create(dom) # TODO: implement something smarter than recreating 
whole tree
    def create(self, dom):
        self.rootitem = DomTreeItem(dom.documentElement, self.treedata)
        self.node = TreeNode(self.canvas, None, self.rootitem)
        self.node.update()
        self.node.select()
        self.rootitem.OnSelect()
        self.node.expand()

class MyTreeItem(TreeItem):
    def __init__(self, treenode, treedata):
        self.node = treenode
        self.previously_selected = None
        self.treedata = treedata
    def GetText(self):
        return self.node.firstChild.nodeValue
    def IsExpandable(self):
        node = self.node
        return len(self.node.getElementsByTagName('node')) > 0
    def OnSelect(self):
        self.treedata.current = self.node
        # TODO: fire off the event
    def GetSubList(self):
        parent = self.node
        children = parent.childNodes
        itemlist = [MyTreeItem(node, self.treedata) for node in children if 
node.nodeName == 'node']
        return itemlist


Thanks for reading
Josip 





More information about the Python-list mailing list