ObjectBrowser.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  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. import re
  10. from idlelib.TreeWidget import TreeItem, TreeNode, ScrolledCanvas
  11. from repr import Repr
  12. myrepr = Repr()
  13. myrepr.maxstring = 100
  14. myrepr.maxother = 100
  15. class ObjectTreeItem(TreeItem):
  16. def __init__(self, labeltext, object, setfunction=None):
  17. self.labeltext = labeltext
  18. self.object = object
  19. self.setfunction = setfunction
  20. def GetLabelText(self):
  21. return self.labeltext
  22. def GetText(self):
  23. return myrepr.repr(self.object)
  24. def GetIconName(self):
  25. if not self.IsExpandable():
  26. return "python"
  27. def IsEditable(self):
  28. return self.setfunction is not None
  29. def SetText(self, text):
  30. try:
  31. value = eval(text)
  32. self.setfunction(value)
  33. except:
  34. pass
  35. else:
  36. self.object = value
  37. def IsExpandable(self):
  38. return not not dir(self.object)
  39. def GetSubList(self):
  40. keys = dir(self.object)
  41. sublist = []
  42. for key in keys:
  43. try:
  44. value = getattr(self.object, key)
  45. except AttributeError:
  46. continue
  47. item = make_objecttreeitem(
  48. str(key) + " =",
  49. value,
  50. lambda value, key=key, object=self.object:
  51. setattr(object, key, value))
  52. sublist.append(item)
  53. return sublist
  54. class InstanceTreeItem(ObjectTreeItem):
  55. def IsExpandable(self):
  56. return True
  57. def GetSubList(self):
  58. sublist = ObjectTreeItem.GetSubList(self)
  59. sublist.insert(0,
  60. make_objecttreeitem("__class__ =", self.object.__class__))
  61. return sublist
  62. class ClassTreeItem(ObjectTreeItem):
  63. def IsExpandable(self):
  64. return True
  65. def GetSubList(self):
  66. sublist = ObjectTreeItem.GetSubList(self)
  67. if len(self.object.__bases__) == 1:
  68. item = make_objecttreeitem("__bases__[0] =",
  69. self.object.__bases__[0])
  70. else:
  71. item = make_objecttreeitem("__bases__ =", self.object.__bases__)
  72. sublist.insert(0, item)
  73. return sublist
  74. class AtomicObjectTreeItem(ObjectTreeItem):
  75. def IsExpandable(self):
  76. return 0
  77. class SequenceTreeItem(ObjectTreeItem):
  78. def IsExpandable(self):
  79. return len(self.object) > 0
  80. def keys(self):
  81. return range(len(self.object))
  82. def GetSubList(self):
  83. sublist = []
  84. for key in self.keys():
  85. try:
  86. value = self.object[key]
  87. except KeyError:
  88. continue
  89. def setfunction(value, key=key, object=self.object):
  90. object[key] = value
  91. item = make_objecttreeitem("%r:" % (key,), value, setfunction)
  92. sublist.append(item)
  93. return sublist
  94. class DictTreeItem(SequenceTreeItem):
  95. def keys(self):
  96. keys = self.object.keys()
  97. try:
  98. keys.sort()
  99. except:
  100. pass
  101. return keys
  102. from types import *
  103. dispatch = {
  104. IntType: AtomicObjectTreeItem,
  105. LongType: AtomicObjectTreeItem,
  106. FloatType: AtomicObjectTreeItem,
  107. StringType: AtomicObjectTreeItem,
  108. TupleType: SequenceTreeItem,
  109. ListType: SequenceTreeItem,
  110. DictType: DictTreeItem,
  111. InstanceType: InstanceTreeItem,
  112. ClassType: ClassTreeItem,
  113. }
  114. def make_objecttreeitem(labeltext, object, setfunction=None):
  115. t = type(object)
  116. if t in dispatch:
  117. c = dispatch[t]
  118. else:
  119. c = ObjectTreeItem
  120. return c(labeltext, object, setfunction)
  121. def _object_browser(parent):
  122. import sys
  123. from Tkinter import Tk
  124. root = Tk()
  125. root.title("Test ObjectBrowser")
  126. width, height, x, y = list(map(int, re.split('[x+]', parent.geometry())))
  127. root.geometry("+%d+%d"%(x, y + 150))
  128. root.configure(bd=0, bg="yellow")
  129. root.focus_set()
  130. sc = ScrolledCanvas(root, bg="white", highlightthickness=0, takefocus=1)
  131. sc.frame.pack(expand=1, fill="both")
  132. item = make_objecttreeitem("sys", sys)
  133. node = TreeNode(sc.canvas, None, item)
  134. node.update()
  135. root.mainloop()
  136. if __name__ == '__main__':
  137. from idlelib.idle_test.htest import run
  138. run(_object_browser)