【问题标题】:Python Tkinter: obtain tree node informationPython Tkinter:获取树节点信息
【发布时间】:2014-05-21 22:55:27
【问题描述】:

Python 2.7 Linux

我只是在 Tkinter.Canvas 中使用 idlelib.TreeWidget 来创建一棵树,没有别的。

如何获取所选树节点的信息(例如名称)?我需要稍后访问此信息。

我可以在选择/双击画布时调用一个函数,但不确定如何使用树节点:

self.canvas.bind('<Double-Button-1>', self.onSave)

请运行以下代码(注意有2棵树,每个Canvas中有1棵树):

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

data = '''
<angel>
 <digital_core>
  <radio_top>d</radio_top>
  <uart_top>e</uart_top>
 </digital_core>
 <digital_core>
  <c>f</c>
 </digital_core>
</angel>
'''
class Application(Frame):

   def __init__(self, parent):
      Frame.__init__(self, parent, background = "white")
      self.parent = parent

      # Maximize window
      self.screenWidth = self.parent.winfo_screenwidth() - 5
      self.screenHeight = self.parent.winfo_screenheight() - 110
      self.parent.geometry('%dx%d+%d+%d' % (self.screenWidth, self.screenHeight, 0, 0))
      self.parent.resizable(0, 0)

      dom = parseString(data)
      item = DomTreeItem(dom.documentElement)
      self.canvas = Canvas(self, bg = "cyan")
      self.canvas.grid(column = 0, row = 0, rowspan = 2, sticky = 'NSWE', padx = 5, pady = 5)
      node = TreeNode(self.canvas, None, item)
      node.update()

      self.canvas2 = Canvas(self, bg = "yellow")
      self.canvas2.grid(column = 1, row = 0, rowspan = 2, sticky = 'NSWE', padx = 5, pady = 5)
      node2 = TreeNode(self.canvas2, None, item)
      node2.update()

      parent.configure(bg = "black")
      self.pack(fill = BOTH, expand = True, padx = 20, pady = 20)

def main():
   root = Tk()
   Application(root)
   root.mainloop()

if __name__ == '__main__':
   main()  

【问题讨论】:

    标签: python python-2.7 canvas tree tkinter


    【解决方案1】:

    DanGar 的回答很有帮助,但不是我想要的。

    TreeItem 已经内置了 GetSelectedIconName 和 OnDoubleClick 函数,所以我在修改后的类中使用它来获取选择的名称:

    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 GetSelectedIconName(self):
          print self.node.nodeName
       def OnDoubleClick(self):
          print "double-clicked"
    

    【讨论】:

      【解决方案2】:

      我见过的最直接的方法是访问TreeNode 的字段以检索传递给TreeNode 构造函数的内容。

      例如,

      node.parent
      node.canvas
      node.item
      

      要从DomTreeItem获取文本,您可以这样做

      node.item.GetText()
      

      您还可以通过查看中的方法获得更多信息

      dir(node.item)
      

      【讨论】:

      • 可以,但是当一个节点被选中时如何触发函数呢?
      • 我可以在双击 Canvas 时调用一个函数,但不确定如何使用树节点
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-07
      • 1970-01-01
      • 2018-09-23
      • 1970-01-01
      • 2012-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多