Python Tkinter:树双击节点 [英] Python Tkinter: Tree double-click node

查看:418
本文介绍了Python Tkinter:树双击节点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Canvas中左右创建了两个带有idlelib.TreeWidget的树。

I have created 2 trees with idlelib.TreeWidget in Canvas, left and right.

我可以打印出树节点的名称,如果双击,但我需要的是从左边双击树节点只打印输出消息。

I am able to print out the name of a tree node if double-clicked, but what I need is double-clicking tree node ONLY from the left will print out messages.

请运行以下代码(左侧树是self.canvas,右self.canvas2):

Please run the following code (left tree is self.canvas, right is self.canvas2):

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

content = '''
<level0>
 <level1/>
</level0>
'''
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(content)
      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(content)
      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()  


推荐答案

您只需要修改 DomTreeItem 类,以接受一个参数,该参数确定它是否应该双击:

You just need to modify the DomTreeItem class to take an argument that determines if it should act on double-click or not:

class DomTreeItem(TreeItem):
   def __init__(self, node, doubleclick=True): # set the value of double-click
      self.node = node
      self.doubleclick = doubleclick           # make the value an instance variable
   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, self.doubleclick) for node in children] # pass it to the nodes
      itemlist = [item for item in prelist if item.GetText().strip()]
      return itemlist
   def OnDoubleClick(self):
      if self.doubleclick:         # check if it's set to True
         print self.node.nodeName  # and only print it then

然后,当你创建一个类的新实例时,只需将 doubleclick 设置为 True False 。如果你不想双击触发第二个树,就像这样实例化:

Then, when you make a new instance of the class, just set doubleclick to True or False. If you don't want a double-click to trigger on the second tree, instantiate it like this:

item2 = DomTreeItem(dom2.documentElement, doubleclick=False)

这篇关于Python Tkinter:树双击节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆