/Python/Lib/idlelib/ObjectBrowser.py

https://gitlab.com/orvi2014/rcs-db-ext · Python · 151 lines · 125 code · 17 blank · 9 comment · 15 complexity · efb55b0dcd8534e01da3d822172869ab MD5 · raw file

  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 repr 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 InstanceTreeItem(ObjectTreeItem):
  54. def IsExpandable(self):
  55. return True
  56. def GetSubList(self):
  57. sublist = ObjectTreeItem.GetSubList(self)
  58. sublist.insert(0,
  59. make_objecttreeitem("__class__ =", self.object.__class__))
  60. return sublist
  61. class ClassTreeItem(ObjectTreeItem):
  62. def IsExpandable(self):
  63. return True
  64. def GetSubList(self):
  65. sublist = ObjectTreeItem.GetSubList(self)
  66. if len(self.object.__bases__) == 1:
  67. item = make_objecttreeitem("__bases__[0] =",
  68. self.object.__bases__[0])
  69. else:
  70. item = make_objecttreeitem("__bases__ =", self.object.__bases__)
  71. sublist.insert(0, item)
  72. return sublist
  73. class AtomicObjectTreeItem(ObjectTreeItem):
  74. def IsExpandable(self):
  75. return 0
  76. class SequenceTreeItem(ObjectTreeItem):
  77. def IsExpandable(self):
  78. return len(self.object) > 0
  79. def keys(self):
  80. return range(len(self.object))
  81. def GetSubList(self):
  82. sublist = []
  83. for key in self.keys():
  84. try:
  85. value = self.object[key]
  86. except KeyError:
  87. continue
  88. def setfunction(value, key=key, object=self.object):
  89. object[key] = value
  90. item = make_objecttreeitem("%r:" % (key,), value, setfunction)
  91. sublist.append(item)
  92. return sublist
  93. class DictTreeItem(SequenceTreeItem):
  94. def keys(self):
  95. keys = self.object.keys()
  96. try:
  97. keys.sort()
  98. except:
  99. pass
  100. return keys
  101. from types import *
  102. dispatch = {
  103. IntType: AtomicObjectTreeItem,
  104. LongType: AtomicObjectTreeItem,
  105. FloatType: AtomicObjectTreeItem,
  106. StringType: AtomicObjectTreeItem,
  107. TupleType: SequenceTreeItem,
  108. ListType: SequenceTreeItem,
  109. DictType: DictTreeItem,
  110. InstanceType: InstanceTreeItem,
  111. ClassType: ClassTreeItem,
  112. }
  113. def make_objecttreeitem(labeltext, object, setfunction=None):
  114. t = type(object)
  115. if t in dispatch:
  116. c = dispatch[t]
  117. else:
  118. c = ObjectTreeItem
  119. return c(labeltext, object, setfunction)
  120. # Test script
  121. def _test():
  122. import sys
  123. from Tkinter import Tk
  124. root = Tk()
  125. root.configure(bd=0, bg="yellow")
  126. root.focus_set()
  127. sc = ScrolledCanvas(root, bg="white", highlightthickness=0, takefocus=1)
  128. sc.frame.pack(expand=1, fill="both")
  129. item = make_objecttreeitem("sys", sys)
  130. node = TreeNode(sc.canvas, None, item)
  131. node.update()
  132. root.mainloop()
  133. if __name__ == '__main__':
  134. _test()