Need help with oo design while using TreeWidget

B

Borivoj

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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,743
Messages
2,569,478
Members
44,899
Latest member
RodneyMcAu

Latest Threads

Top