6 from TreeWidget
import TreeNode
, TreeItem
, ScrolledCanvas
7 from ObjectBrowser
import ObjectTreeItem
, make_objecttreeitem
8 from OldStackViewer
import StackViewer
, NamespaceViewer
10 def StackBrowser(root
, flist
=None, tb
=None, top
=None):
12 from Tkinter
import Toplevel
14 sc
= ScrolledCanvas(top
, bg
="white", highlightthickness
=0)
15 sc
.frame
.pack(expand
=1, fill
="both")
16 item
= StackTreeItem(flist
, tb
)
17 node
= TreeNode(sc
.canvas
, None, item
)
20 class StackTreeItem(TreeItem
):
22 def __init__(self
, flist
=None, tb
=None):
24 self
.stack
= get_stack(tb
)
25 self
.text
= get_exception()
32 for info
in self
.stack
:
33 item
= FrameTreeItem(info
, self
.flist
)
37 class FrameTreeItem(TreeItem
):
39 def __init__(self
, info
, flist
):
44 frame
, lineno
= self
.info
46 modname
= frame
.f_globals
["__name__"]
50 filename
= code
.co_filename
51 funcname
= code
.co_name
52 sourceline
= linecache
.getline(filename
, lineno
)
53 sourceline
= string
.strip(sourceline
)
54 if funcname
in ("?", "", None):
55 item
= "%s, line %d: %s" % (modname
, lineno
, sourceline
)
57 item
= "%s.%s(...), line %d: %s" % (modname
, funcname
,
64 frame
, lineno
= self
.info
66 if frame
.f_globals
is not frame
.f_locals
:
67 item
= VariablesTreeItem("<locals>", frame
.f_locals
, self
.flist
)
69 item
= VariablesTreeItem("<globals>", frame
.f_globals
, self
.flist
)
73 def OnDoubleClick(self
):
75 frame
, lineno
= self
.info
76 filename
= frame
.f_code
.co_filename
77 if os
.path
.isfile(filename
):
78 self
.flist
.gotofileline(filename
, lineno
)
80 class VariablesTreeItem(ObjectTreeItem
):
85 def GetLabelText(self
):
88 def IsExpandable(self
):
89 return len(self
.object) > 0
92 return self
.object.keys()
96 for key
in self
.keys():
98 value
= self
.object[key
]
101 def setfunction(value
, key
=key
, object=self
.object):
103 item
= make_objecttreeitem(key
+ " =", value
, setfunction
)
107 def get_stack(t
=None, f
=None):
109 t
= sys
.last_traceback
111 if t
and t
.tb_frame
is f
:
114 stack
.append((f
, f
.f_lineno
))
115 if f
is self
.botframe
:
120 stack
.append((t
.tb_frame
, t
.tb_lineno
))
124 def get_exception(type=None, value
=None):
127 value
= sys
.last_value
128 if hasattr(type, "__name__"):
131 if value
is not None:
132 s
= s
+ ": " + str(value
)
140 sys
.last_type
, sys
.last_value
, sys
.last_traceback
= sys
.exc_info()
141 from Tkinter
import Tk
143 StackBrowser(None, top
=root
)
146 if __name__
== "__main__":