You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

138 lines
3.7 KiB

26 years ago
26 years ago
26 years ago
26 years ago
26 years ago
26 years ago
26 years ago
26 years ago
26 years ago
26 years ago
26 years ago
  1. # XXX TO DO:
  2. # - popup menu
  3. # - support partial or total redisplay
  4. # - more doc strings
  5. # - tooltips
  6. # object browser
  7. # XXX TO DO:
  8. # - for classes/modules, add "open source" to object browser
  9. from idlelib.TreeWidget import TreeItem, TreeNode, ScrolledCanvas
  10. from reprlib import Repr
  11. myrepr = Repr()
  12. myrepr.maxstring = 100
  13. myrepr.maxother = 100
  14. class ObjectTreeItem(TreeItem):
  15. def __init__(self, labeltext, object, setfunction=None):
  16. self.labeltext = labeltext
  17. self.object = object
  18. self.setfunction = setfunction
  19. def GetLabelText(self):
  20. return self.labeltext
  21. def GetText(self):
  22. return myrepr.repr(self.object)
  23. def GetIconName(self):
  24. if not self.IsExpandable():
  25. return "python"
  26. def IsEditable(self):
  27. return self.setfunction is not None
  28. def SetText(self, text):
  29. try:
  30. value = eval(text)
  31. self.setfunction(value)
  32. except:
  33. pass
  34. else:
  35. self.object = value
  36. def IsExpandable(self):
  37. return not not dir(self.object)
  38. def GetSubList(self):
  39. keys = dir(self.object)
  40. sublist = []
  41. for key in keys:
  42. try:
  43. value = getattr(self.object, key)
  44. except AttributeError:
  45. continue
  46. item = make_objecttreeitem(
  47. str(key) + " =",
  48. value,
  49. lambda value, key=key, object=self.object:
  50. setattr(object, key, value))
  51. sublist.append(item)
  52. return sublist
  53. class ClassTreeItem(ObjectTreeItem):
  54. def IsExpandable(self):
  55. return True
  56. def GetSubList(self):
  57. sublist = ObjectTreeItem.GetSubList(self)
  58. if len(self.object.__bases__) == 1:
  59. item = make_objecttreeitem("__bases__[0] =",
  60. self.object.__bases__[0])
  61. else:
  62. item = make_objecttreeitem("__bases__ =", self.object.__bases__)
  63. sublist.insert(0, item)
  64. return sublist
  65. class AtomicObjectTreeItem(ObjectTreeItem):
  66. def IsExpandable(self):
  67. return 0
  68. class SequenceTreeItem(ObjectTreeItem):
  69. def IsExpandable(self):
  70. return len(self.object) > 0
  71. def keys(self):
  72. return range(len(self.object))
  73. def GetSubList(self):
  74. sublist = []
  75. for key in self.keys():
  76. try:
  77. value = self.object[key]
  78. except KeyError:
  79. continue
  80. def setfunction(value, key=key, object=self.object):
  81. object[key] = value
  82. item = make_objecttreeitem("%r:" % (key,), value, setfunction)
  83. sublist.append(item)
  84. return sublist
  85. class DictTreeItem(SequenceTreeItem):
  86. def keys(self):
  87. keys = list(self.object.keys())
  88. try:
  89. keys.sort()
  90. except:
  91. pass
  92. return keys
  93. dispatch = {
  94. int: AtomicObjectTreeItem,
  95. float: AtomicObjectTreeItem,
  96. str: AtomicObjectTreeItem,
  97. tuple: SequenceTreeItem,
  98. list: SequenceTreeItem,
  99. dict: DictTreeItem,
  100. type: ClassTreeItem,
  101. }
  102. def make_objecttreeitem(labeltext, object, setfunction=None):
  103. t = type(object)
  104. if t in dispatch:
  105. c = dispatch[t]
  106. else:
  107. c = ObjectTreeItem
  108. return c(labeltext, object, setfunction)
  109. # Test script
  110. def _test():
  111. import sys
  112. from tkinter import Tk
  113. root = Tk()
  114. root.configure(bd=0, bg="yellow")
  115. root.focus_set()
  116. sc = ScrolledCanvas(root, bg="white", highlightthickness=0, takefocus=1)
  117. sc.frame.pack(expand=1, fill="both")
  118. item = make_objecttreeitem("sys", sys)
  119. node = TreeNode(sc.canvas, None, item)
  120. node.update()
  121. root.mainloop()
  122. if __name__ == '__main__':
  123. _test()