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, tb
=None, top
=None):
11 from Tkinter
import Toplevel
13 sc
= ScrolledCanvas(top
, bg
="white", highlightthickness
=0)
14 sc
.frame
.pack(expand
=1, fill
="both")
15 item
= StackTreeItem(flist
, tb
)
16 node
= TreeNode(sc
.canvas
, None, item
)
19 class StackTreeItem(TreeItem
):
21 def __init__(self
, flist
=None, tb
=None):
23 self
.stack
= get_stack(tb
)
24 self
.text
= get_exception()
31 for info
in self
.stack
:
32 item
= FrameTreeItem(info
, self
.flist
)
36 class FrameTreeItem(TreeItem
):
38 def __init__(self
, info
, flist
):
43 frame
, lineno
= self
.info
45 modname
= frame
.f_globals
["__name__"]
49 filename
= code
.co_filename
50 funcname
= code
.co_name
51 sourceline
= linecache
.getline(filename
, lineno
)
52 sourceline
= sourceline
.strip()
53 if funcname
in ("?", "", None):
54 item
= "%s, line %d: %s" % (modname
, lineno
, sourceline
)
56 item
= "%s.%s(...), line %d: %s" % (modname
, funcname
,
63 frame
, lineno
= self
.info
65 if frame
.f_globals
is not frame
.f_locals
:
66 item
= VariablesTreeItem("<locals>", frame
.f_locals
, self
.flist
)
68 item
= VariablesTreeItem("<globals>", frame
.f_globals
, self
.flist
)
72 def OnDoubleClick(self
):
74 frame
, lineno
= self
.info
75 filename
= frame
.f_code
.co_filename
76 if os
.path
.isfile(filename
):
77 self
.flist
.gotofileline(filename
, lineno
)
79 class VariablesTreeItem(ObjectTreeItem
):
84 def GetLabelText(self
):
87 def IsExpandable(self
):
88 return len(self
.object) > 0
91 return self
.object.keys()
95 for key
in self
.keys():
97 value
= self
.object[key
]
100 def setfunction(value
, key
=key
, object=self
.object):
102 item
= make_objecttreeitem(key
+ " =", value
, setfunction
)
106 def get_stack(t
=None, f
=None):
108 t
= sys
.last_traceback
110 if t
and t
.tb_frame
is f
:
113 stack
.append((f
, f
.f_lineno
))
114 if f
is self
.botframe
:
119 stack
.append((t
.tb_frame
, t
.tb_lineno
))
123 def get_exception(type=None, value
=None):
126 value
= sys
.last_value
127 if hasattr(type, "__name__"):
130 if value
is not None:
131 s
= s
+ ": " + str(value
)
139 sys
.last_type
, sys
.last_value
, sys
.last_traceback
= sys
.exc_info()
140 from Tkinter
import Tk
142 StackBrowser(None, top
=root
)
145 if __name__
== "__main__":