annotate CSP2/CSP2_env/env-d9b9114564458d9d-741b3de822f2aaca6c6caa4325c4afce/lib/python3.8/idlelib/stackviewer.py @ 69:33d812a61356

planemo upload commit 2e9511a184a1ca667c7be0c6321a36dc4e3d116d
author jpayne
date Tue, 18 Mar 2025 17:55:14 -0400
parents
children
rev   line source
jpayne@69 1 import linecache
jpayne@69 2 import os
jpayne@69 3 import sys
jpayne@69 4
jpayne@69 5 import tkinter as tk
jpayne@69 6
jpayne@69 7 from idlelib.debugobj import ObjectTreeItem, make_objecttreeitem
jpayne@69 8 from idlelib.tree import TreeNode, TreeItem, ScrolledCanvas
jpayne@69 9
jpayne@69 10 def StackBrowser(root, flist=None, tb=None, top=None):
jpayne@69 11 global sc, item, node # For testing.
jpayne@69 12 if top is None:
jpayne@69 13 top = tk.Toplevel(root)
jpayne@69 14 sc = ScrolledCanvas(top, bg="white", highlightthickness=0)
jpayne@69 15 sc.frame.pack(expand=1, fill="both")
jpayne@69 16 item = StackTreeItem(flist, tb)
jpayne@69 17 node = TreeNode(sc.canvas, None, item)
jpayne@69 18 node.expand()
jpayne@69 19
jpayne@69 20
jpayne@69 21 class StackTreeItem(TreeItem):
jpayne@69 22
jpayne@69 23 def __init__(self, flist=None, tb=None):
jpayne@69 24 self.flist = flist
jpayne@69 25 self.stack = self.get_stack(tb)
jpayne@69 26 self.text = self.get_exception()
jpayne@69 27
jpayne@69 28 def get_stack(self, tb):
jpayne@69 29 if tb is None:
jpayne@69 30 tb = sys.last_traceback
jpayne@69 31 stack = []
jpayne@69 32 if tb and tb.tb_frame is None:
jpayne@69 33 tb = tb.tb_next
jpayne@69 34 while tb is not None:
jpayne@69 35 stack.append((tb.tb_frame, tb.tb_lineno))
jpayne@69 36 tb = tb.tb_next
jpayne@69 37 return stack
jpayne@69 38
jpayne@69 39 def get_exception(self):
jpayne@69 40 type = sys.last_type
jpayne@69 41 value = sys.last_value
jpayne@69 42 if hasattr(type, "__name__"):
jpayne@69 43 type = type.__name__
jpayne@69 44 s = str(type)
jpayne@69 45 if value is not None:
jpayne@69 46 s = s + ": " + str(value)
jpayne@69 47 return s
jpayne@69 48
jpayne@69 49 def GetText(self):
jpayne@69 50 return self.text
jpayne@69 51
jpayne@69 52 def GetSubList(self):
jpayne@69 53 sublist = []
jpayne@69 54 for info in self.stack:
jpayne@69 55 item = FrameTreeItem(info, self.flist)
jpayne@69 56 sublist.append(item)
jpayne@69 57 return sublist
jpayne@69 58
jpayne@69 59
jpayne@69 60 class FrameTreeItem(TreeItem):
jpayne@69 61
jpayne@69 62 def __init__(self, info, flist):
jpayne@69 63 self.info = info
jpayne@69 64 self.flist = flist
jpayne@69 65
jpayne@69 66 def GetText(self):
jpayne@69 67 frame, lineno = self.info
jpayne@69 68 try:
jpayne@69 69 modname = frame.f_globals["__name__"]
jpayne@69 70 except:
jpayne@69 71 modname = "?"
jpayne@69 72 code = frame.f_code
jpayne@69 73 filename = code.co_filename
jpayne@69 74 funcname = code.co_name
jpayne@69 75 sourceline = linecache.getline(filename, lineno)
jpayne@69 76 sourceline = sourceline.strip()
jpayne@69 77 if funcname in ("?", "", None):
jpayne@69 78 item = "%s, line %d: %s" % (modname, lineno, sourceline)
jpayne@69 79 else:
jpayne@69 80 item = "%s.%s(...), line %d: %s" % (modname, funcname,
jpayne@69 81 lineno, sourceline)
jpayne@69 82 return item
jpayne@69 83
jpayne@69 84 def GetSubList(self):
jpayne@69 85 frame, lineno = self.info
jpayne@69 86 sublist = []
jpayne@69 87 if frame.f_globals is not frame.f_locals:
jpayne@69 88 item = VariablesTreeItem("<locals>", frame.f_locals, self.flist)
jpayne@69 89 sublist.append(item)
jpayne@69 90 item = VariablesTreeItem("<globals>", frame.f_globals, self.flist)
jpayne@69 91 sublist.append(item)
jpayne@69 92 return sublist
jpayne@69 93
jpayne@69 94 def OnDoubleClick(self):
jpayne@69 95 if self.flist:
jpayne@69 96 frame, lineno = self.info
jpayne@69 97 filename = frame.f_code.co_filename
jpayne@69 98 if os.path.isfile(filename):
jpayne@69 99 self.flist.gotofileline(filename, lineno)
jpayne@69 100
jpayne@69 101
jpayne@69 102 class VariablesTreeItem(ObjectTreeItem):
jpayne@69 103
jpayne@69 104 def GetText(self):
jpayne@69 105 return self.labeltext
jpayne@69 106
jpayne@69 107 def GetLabelText(self):
jpayne@69 108 return None
jpayne@69 109
jpayne@69 110 def IsExpandable(self):
jpayne@69 111 return len(self.object) > 0
jpayne@69 112
jpayne@69 113 def GetSubList(self):
jpayne@69 114 sublist = []
jpayne@69 115 for key in self.object.keys():
jpayne@69 116 try:
jpayne@69 117 value = self.object[key]
jpayne@69 118 except KeyError:
jpayne@69 119 continue
jpayne@69 120 def setfunction(value, key=key, object=self.object):
jpayne@69 121 object[key] = value
jpayne@69 122 item = make_objecttreeitem(key + " =", value, setfunction)
jpayne@69 123 sublist.append(item)
jpayne@69 124 return sublist
jpayne@69 125
jpayne@69 126
jpayne@69 127 def _stack_viewer(parent): # htest #
jpayne@69 128 from idlelib.pyshell import PyShellFileList
jpayne@69 129 top = tk.Toplevel(parent)
jpayne@69 130 top.title("Test StackViewer")
jpayne@69 131 x, y = map(int, parent.geometry().split('+')[1:])
jpayne@69 132 top.geometry("+%d+%d" % (x + 50, y + 175))
jpayne@69 133 flist = PyShellFileList(top)
jpayne@69 134 try: # to obtain a traceback object
jpayne@69 135 intentional_name_error
jpayne@69 136 except NameError:
jpayne@69 137 exc_type, exc_value, exc_tb = sys.exc_info()
jpayne@69 138 # inject stack trace to sys
jpayne@69 139 sys.last_type = exc_type
jpayne@69 140 sys.last_value = exc_value
jpayne@69 141 sys.last_traceback = exc_tb
jpayne@69 142
jpayne@69 143 StackBrowser(top, flist=flist, top=top, tb=exc_tb)
jpayne@69 144
jpayne@69 145 # restore sys to original state
jpayne@69 146 del sys.last_type
jpayne@69 147 del sys.last_value
jpayne@69 148 del sys.last_traceback
jpayne@69 149
jpayne@69 150 if __name__ == '__main__':
jpayne@69 151 from unittest import main
jpayne@69 152 main('idlelib.idle_test.test_stackviewer', verbosity=2, exit=False)
jpayne@69 153
jpayne@69 154 from idlelib.idle_test.htest import run
jpayne@69 155 run(_stack_viewer)