5 from TreeWidget
import TreeNode
, TreeItem
, ScrolledCanvas
6 from ObjectBrowser
import ObjectTreeItem
, make_objecttreeitem
7 from OldStackViewer
import StackViewer
, NamespaceViewer
9 def StackBrowser(root
, flist
=None, stack
=None):
11 sc
= ScrolledCanvas(top
, bg
="white", highlightthickness
=0)
12 sc
.frame
.pack(expand
=1, fill
="both")
13 item
= StackTreeItem(flist
)
14 node
= TreeNode(sc
.canvas
, None, item
)
17 class StackTreeItem(TreeItem
):
19 def __init__(self
, flist
=None):
21 self
.stack
= get_stack()
22 self
.text
= get_exception()
29 for info
in self
.stack
:
30 item
= FrameTreeItem(info
, self
.flist
)
34 class FrameTreeItem(TreeItem
):
36 def __init__(self
, info
, flist
):
41 frame
, lineno
= self
.info
43 modname
= frame
.f_globals
["__name__"]
47 filename
= code
.co_filename
48 funcname
= code
.co_name
49 sourceline
= linecache
.getline(filename
, lineno
)
50 sourceline
= string
.strip(sourceline
)
51 if funcname
in ("?", "", None):
52 item
= "%s, line %d: %s" % (modname
, lineno
, sourceline
)
54 item
= "%s.%s(...), line %d: %s" % (modname
, funcname
,
61 frame
, lineno
= self
.info
63 if frame
.f_globals
is not frame
.f_locals
:
64 item
= VariablesTreeItem("<locals>", frame
.f_locals
, self
.flist
)
66 item
= VariablesTreeItem("<globals>", frame
.f_globals
, self
.flist
)
70 def OnDoubleClick(self
):
72 frame
, lineno
= self
.info
73 filename
= frame
.f_code
.co_filename
74 edit
= self
.flist
.open(filename
)
77 class VariablesTreeItem(ObjectTreeItem
):
82 def GetLabelText(self
):
85 def IsExpandable(self
):
86 return len(self
.object) > 0
89 return self
.object.keys()
93 for key
in self
.keys():
95 value
= self
.object[key
]
98 def setfunction(value
, key
=key
, object=self
.object):
100 item
= make_objecttreeitem(key
+ " =", value
, setfunction
)
104 def get_stack(t
=None, f
=None):
106 t
= sys
.last_traceback
108 if t
and t
.tb_frame
is f
:
111 stack
.append((f
, f
.f_lineno
))
112 if f
is self
.botframe
:
117 stack
.append((t
.tb_frame
, t
.tb_lineno
))
121 def get_exception(type=None, value
=None):
124 value
= sys
.last_value
125 if hasattr(type, "__name__"):
128 if value
is not None:
129 s
= s
+ ": " + str(value
)
132 if __name__
== "__main__":