我用idlelib.TreeWidget公司在画布上,左右。在
如果双击,我也可以打印出树节点的名称,但我需要的是双击一个树节点将使某个树节点可见并被选中。在
我有一个简单的例子。如果双击左侧的“level1”,则右侧的“ccc”应可见并自动选中。你怎么做到的?在
请运行以下代码:
from Tkinter import Tk, Frame, BOTH, Canvas
from xml.dom.minidom import parseString
from idlelib.TreeWidget import TreeItem, TreeNode
class DomTreeItem(TreeItem):
def __init__(self, node):
self.node = node
def GetText(self):
node = self.node
if node.nodeType == node.ELEMENT_NODE:
return node.nodeName
elif node.nodeType == node.TEXT_NODE:
return node.nodeValue
def IsExpandable(self):
node = self.node
return node.hasChildNodes()
def GetSubList(self):
parent = self.node
children = parent.childNodes
prelist = [DomTreeItem(node) for node in children]
itemlist = [item for item in prelist if item.GetText().strip()]
return itemlist
def OnDoubleClick(self):
print self.node.nodeName
left = '''
<level0>
<level1/>
</level0>
'''
right = '''
<aaa>
<bbb> <ccc/> </bbb>
</aaa>
'''
class Application(Frame):
def __init__(self, parent):
Frame.__init__(self, parent)
self.parent = parent
self.parent.geometry('%dx%d+%d+%d' % (800, 300, 0, 0))
self.parent.resizable(0, 0)
dom = parseString(left)
item = DomTreeItem(dom.documentElement)
self.canvas = Canvas(self, bg = "cyan")
self.canvas.grid(column = 0, row = 0, sticky = 'NSWE')
node = TreeNode(self.canvas, None, item)
node.update()
dom2 = parseString(right)
item2 = DomTreeItem(dom2.documentElement)
self.canvas2 = Canvas(self, bg = "yellow")
self.canvas2.grid(column = 1, row = 0, sticky = 'NSWE')
node2 = TreeNode(self.canvas2, None, item2)
node2.update()
self.pack(fill = BOTH, expand = True)
def main():
root = Tk()
Application(root)
root.mainloop()
if __name__ == '__main__':
main()
首先,双击回调必须知道TreeNode
node2
(我可以想到全局变量、DomTreeItem中的属性或反弹到另一个组件)。在然后可以依赖TreeNode的
expand()
方法,读取children
属性并按顺序展开,直到得到所需的元素。请注意,children
属性仅在节点展开后填充。在1。快速回答
为您提供的示例提供快速而肮脏的解决方案
2。通用解决方案
这里有一个更通用的方法来显示树中的任意项。在
^{pr2}$你可以这样用
3。架构方案
除了扩展一个项目的选择,我建议你通过一个DIY观察者一个更干净的架构。在
DIY观察者
(模拟Tkinter
bind
调用,但自generating event with user data is not properly handled起不依赖Tkinter机制)专用组件
依赖于上述reach方法。在
订阅
我没有找到idlelib的文档,在这种情况下,您可以尝试查看代码。下面的代码片段允许您找到该模块的宿主文件。
相关问题 更多 >
编程相关推荐