cpython/Lib/idlelib/ObjectBrowser.py
Kurt B. Kaiser 2d7f6a079d Switch to absolute imports to support direct execution of modules. Many
IDLE modules have main() or test() functions which are essential for testing.


M    idlelib/AutoCompleteWindow.py
M    idlelib/UndoDelegator.py
M    idlelib/Bindings.py
M    idlelib/AutoComplete.py
M    idlelib/configHandler.py
M    idlelib/HyperParser.py
M    idlelib/ColorDelegator.py
M    idlelib/ObjectBrowser.py
M    idlelib/ZoomHeight.py
M    idlelib/PyShell.py
M    idlelib/ParenMatch.py
M    idlelib/Debugger.py
M    idlelib/configDialog.py
M    idlelib/StackViewer.py
M    idlelib/ReplaceDialog.py
M    idlelib/ScriptBinding.py
M    idlelib/GrepDialog.py
M    idlelib/EditorWindow.py
M    idlelib/FormatParagraph.py
M    idlelib/OutputWindow.py
M    idlelib/aboutDialog.py
M    idlelib/IdleHistory.py
M    idlelib/PathBrowser.py
M    idlelib/ClassBrowser.py
M    idlelib/CallTips.py
M    idlelib/FileList.py
M    idlelib/idle.py
M    idlelib/CodeContext.py
M    idlelib/SearchDialog.py
M    idlelib/RemoteObjectBrowser.py
M    idlelib/RemoteDebugger.py
M    idlelib/TreeWidget.py
M    idlelib/run.py
M    idlelib/Percolator.py
M    idlelib/macosxSupport.py
2007-08-22 23:01:33 +00:00

139 lines
3.7 KiB
Python

# XXX TO DO:
# - popup menu
# - support partial or total redisplay
# - more doc strings
# - tooltips
# object browser
# XXX TO DO:
# - for classes/modules, add "open source" to object browser
from idlelib.TreeWidget import TreeItem, TreeNode, ScrolledCanvas
from repr import Repr
myrepr = Repr()
myrepr.maxstring = 100
myrepr.maxother = 100
class ObjectTreeItem(TreeItem):
def __init__(self, labeltext, object, setfunction=None):
self.labeltext = labeltext
self.object = object
self.setfunction = setfunction
def GetLabelText(self):
return self.labeltext
def GetText(self):
return myrepr.repr(self.object)
def GetIconName(self):
if not self.IsExpandable():
return "python"
def IsEditable(self):
return self.setfunction is not None
def SetText(self, text):
try:
value = eval(text)
self.setfunction(value)
except:
pass
else:
self.object = value
def IsExpandable(self):
return not not dir(self.object)
def GetSubList(self):
keys = dir(self.object)
sublist = []
for key in keys:
try:
value = getattr(self.object, key)
except AttributeError:
continue
item = make_objecttreeitem(
str(key) + " =",
value,
lambda value, key=key, object=self.object:
setattr(object, key, value))
sublist.append(item)
return sublist
class ClassTreeItem(ObjectTreeItem):
def IsExpandable(self):
return True
def GetSubList(self):
sublist = ObjectTreeItem.GetSubList(self)
if len(self.object.__bases__) == 1:
item = make_objecttreeitem("__bases__[0] =",
self.object.__bases__[0])
else:
item = make_objecttreeitem("__bases__ =", self.object.__bases__)
sublist.insert(0, item)
return sublist
class AtomicObjectTreeItem(ObjectTreeItem):
def IsExpandable(self):
return 0
class SequenceTreeItem(ObjectTreeItem):
def IsExpandable(self):
return len(self.object) > 0
def keys(self):
return range(len(self.object))
def GetSubList(self):
sublist = []
for key in self.keys():
try:
value = self.object[key]
except KeyError:
continue
def setfunction(value, key=key, object=self.object):
object[key] = value
item = make_objecttreeitem("%r:" % (key,), value, setfunction)
sublist.append(item)
return sublist
class DictTreeItem(SequenceTreeItem):
def keys(self):
keys = self.object.keys()
try:
keys.sort()
except:
pass
return keys
dispatch = {
int: AtomicObjectTreeItem,
float: AtomicObjectTreeItem,
str: AtomicObjectTreeItem,
tuple: SequenceTreeItem,
list: SequenceTreeItem,
dict: DictTreeItem,
type: ClassTreeItem,
}
def make_objecttreeitem(labeltext, object, setfunction=None):
t = type(object)
if t in dispatch:
c = dispatch[t]
else:
c = ObjectTreeItem
return c(labeltext, object, setfunction)
# Test script
def _test():
import sys
from Tkinter import Tk
root = Tk()
root.configure(bd=0, bg="yellow")
root.focus_set()
sc = ScrolledCanvas(root, bg="white", highlightthickness=0, takefocus=1)
sc.frame.pack(expand=1, fill="both")
item = make_objecttreeitem("sys", sys)
node = TreeNode(sc.canvas, None, item)
node.update()
root.mainloop()
if __name__ == '__main__':
_test()