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