home *** CD-ROM | disk | FTP | other *** search
/ Freelog 33 / Freelog033.iso / Progr / Python-2.2.1.exe / STACKVIEWER.PY < prev    next >
Encoding:
Python Source  |  2001-05-12  |  4.1 KB  |  148 lines

  1. import os
  2. import sys
  3. import string
  4. import linecache
  5.  
  6. from TreeWidget import TreeNode, TreeItem, ScrolledCanvas
  7. from ObjectBrowser import ObjectTreeItem, make_objecttreeitem
  8. from OldStackViewer import StackViewer, NamespaceViewer
  9.  
  10. def StackBrowser(root, flist=None, tb=None, top=None):
  11.     if top is None:
  12.         from Tkinter import Toplevel
  13.         top = Toplevel(root)
  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)
  18.     node.expand()
  19.  
  20. class StackTreeItem(TreeItem):
  21.  
  22.     def __init__(self, flist=None, tb=None):
  23.         self.flist = flist
  24.         self.stack = get_stack(tb)
  25.         self.text = get_exception()
  26.  
  27.     def GetText(self):
  28.         return self.text
  29.  
  30.     def GetSubList(self):
  31.         sublist = []
  32.         for info in self.stack:
  33.             item = FrameTreeItem(info, self.flist)
  34.             sublist.append(item)
  35.         return sublist
  36.  
  37. class FrameTreeItem(TreeItem):
  38.  
  39.     def __init__(self, info, flist):
  40.         self.info = info
  41.         self.flist = flist
  42.  
  43.     def GetText(self):
  44.         frame, lineno = self.info
  45.         try:
  46.             modname = frame.f_globals["__name__"]
  47.         except:
  48.             modname = "?"
  49.         code = frame.f_code
  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)
  56.         else:
  57.             item = "%s.%s(...), line %d: %s" % (modname, funcname,
  58.                                              lineno, sourceline)
  59. ##        if i == index:
  60. ##            item = "> " + item
  61.         return item
  62.  
  63.     def GetSubList(self):
  64.         frame, lineno = self.info
  65.         sublist = []
  66.         if frame.f_globals is not frame.f_locals:
  67.             item = VariablesTreeItem("<locals>", frame.f_locals, self.flist)
  68.             sublist.append(item)
  69.         item = VariablesTreeItem("<globals>", frame.f_globals, self.flist)
  70.         sublist.append(item)
  71.         return sublist
  72.  
  73.     def OnDoubleClick(self):
  74.         if self.flist:
  75.             frame, lineno = self.info
  76.             filename = frame.f_code.co_filename
  77.             if os.path.isfile(filename):
  78.                 self.flist.gotofileline(filename, lineno)
  79.  
  80. class VariablesTreeItem(ObjectTreeItem):
  81.  
  82.     def GetText(self):
  83.         return self.labeltext
  84.  
  85.     def GetLabelText(self):
  86.         return None
  87.  
  88.     def IsExpandable(self):
  89.         return len(self.object) > 0
  90.  
  91.     def keys(self):
  92.         return self.object.keys()
  93.  
  94.     def GetSubList(self):
  95.         sublist = []
  96.         for key in self.keys():
  97.             try:
  98.                 value = self.object[key]
  99.             except KeyError:
  100.                 continue
  101.             def setfunction(value, key=key, object=self.object):
  102.                 object[key] = value
  103.             item = make_objecttreeitem(key + " =", value, setfunction)
  104.             sublist.append(item)
  105.         return sublist
  106.  
  107. def get_stack(t=None, f=None):
  108.     if t is None:
  109.         t = sys.last_traceback
  110.     stack = []
  111.     if t and t.tb_frame is f:
  112.         t = t.tb_next
  113.     while f is not None:
  114.         stack.append((f, f.f_lineno))
  115.         if f is self.botframe:
  116.             break
  117.         f = f.f_back
  118.     stack.reverse()
  119.     while t is not None:
  120.         stack.append((t.tb_frame, t.tb_lineno))
  121.         t = t.tb_next
  122.     return stack
  123.  
  124. def get_exception(type=None, value=None):
  125.     if type is None:
  126.         type = sys.last_type
  127.         value = sys.last_value
  128.     if hasattr(type, "__name__"):
  129.         type = type.__name__
  130.     s = str(type)
  131.     if value is not None:
  132.         s = s + ": " + str(value)
  133.     return s
  134.  
  135. def _test():
  136.     try:
  137.         import testcode
  138.         reload(testcode)
  139.     except:
  140.         sys.last_type, sys.last_value, sys.last_traceback = sys.exc_info()
  141.     from Tkinter import Tk
  142.     root = Tk()
  143.     StackBrowser(None, top=root)
  144.     root.mainloop()
  145.  
  146. if __name__ == "__main__":
  147.     _test()
  148.