# 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 browserfrom reprlib import Reprfrom idlelib.tree import TreeItem, TreeNode, ScrolledCanvasmyrepr = Repr()myrepr.maxstring = 100myrepr.maxother = 100class ObjectTreeItem(TreeItem):def __init__(self, labeltext, object, setfunction=None):self.labeltext = labeltextself.object = objectself.setfunction = setfunctiondef GetLabelText(self):return self.labeltextdef GetText(self):return myrepr.repr(self.object)def GetIconName(self):if not self.IsExpandable():return "python"def IsEditable(self):return self.setfunction is not Nonedef SetText(self, text):try:value = eval(text)self.setfunction(value)except:passelse:self.object = valuedef 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:continueitem = make_objecttreeitem(str(key) + " =",value,lambda value, key=key, object=self.object:setattr(object, key, value))sublist.append(item)return sublistclass ClassTreeItem(ObjectTreeItem):def IsExpandable(self):return Truedef 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 sublistclass AtomicObjectTreeItem(ObjectTreeItem):def IsExpandable(self):return Falseclass SequenceTreeItem(ObjectTreeItem):def IsExpandable(self):return len(self.object) > 0def keys(self):return range(len(self.object))def GetSubList(self):sublist = []for key in self.keys():try:value = self.object[key]except KeyError:continuedef setfunction(value, key=key, object=self.object):object[key] = valueitem = make_objecttreeitem("%r:" % (key,), value, setfunction)sublist.append(item)return sublistclass DictTreeItem(SequenceTreeItem):def keys(self):keys = list(self.object.keys())try:keys.sort()except:passreturn keysdispatch = {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 = ObjectTreeItemreturn c(labeltext, object, setfunction)def _object_browser(parent): # htest #import sysfrom tkinter import Topleveltop = Toplevel(parent)top.title("Test debug object browser")x, y = map(int, parent.geometry().split('+')[1:])top.geometry("+%d+%d" % (x + 100, y + 175))top.configure(bd=0, bg="yellow")top.focus_set()sc = ScrolledCanvas(top, 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()if __name__ == '__main__':from unittest import mainmain('idlelib.idle_test.test_debugobj', verbosity=2, exit=False)from idlelib.idle_test.htest import runrun(_object_browser)
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。