blob: a292b4c7860f5db01a7aaf8b4de46564da6bd154 [file] [log] [blame]
Guido van Rossum35f75421998-10-13 23:51:13 +00001import os
2import bdb
3import traceback
4from Tkinter import *
5
6
7class Debugger(bdb.Bdb):
8
Guido van Rossum35e55da1998-10-14 03:43:05 +00009 interacting = 0
10
Guido van Rossum35f75421998-10-13 23:51:13 +000011 def __init__(self, pyshell):
12 bdb.Bdb.__init__(self)
13 self.pyshell = pyshell
14 self.make_gui()
15
16 def close(self):
Guido van Rossum35e55da1998-10-14 03:43:05 +000017 if self.interacting:
18 self.top.bell()
19 return
20 self.pyshell.close_debugger()
Guido van Rossum35f75421998-10-13 23:51:13 +000021 self.top.destroy()
Guido van Rossum35e55da1998-10-14 03:43:05 +000022
23 def run(self, *args):
24 try:
25 self.interacting = 1
26 return apply(bdb.Bdb.run, (self,) + args)
27 finally:
28 self.interacting = 0
Guido van Rossum35f75421998-10-13 23:51:13 +000029
30 def user_line(self, frame):
31 self.interaction(frame)
32
33 def user_return(self, frame, rv):
34 # XXX show rv?
35 self.interaction(frame)
36
37 def user_exception(self, frame, info):
38 self.interaction(frame, info)
39
40 def make_gui(self):
41 pyshell = self.pyshell
42 self.flist = pyshell.flist
43 self.root = root = pyshell.root
44 self.top = top = Toplevel(root)
Guido van Rossum35e55da1998-10-14 03:43:05 +000045 top.wm_protocol("WM_DELETE_WINDOW", self.close)
Guido van Rossum35f75421998-10-13 23:51:13 +000046 self.bframe = bframe = Frame(top)
Guido van Rossum35e55da1998-10-14 03:43:05 +000047 self.bframe.pack(anchor="w")
Guido van Rossum35f75421998-10-13 23:51:13 +000048 self.buttons = bl = []
49 self.bcont = b = Button(bframe, text="Go", command=self.cont)
50 bl.append(b)
51 self.bstep = b = Button(bframe, text="Step into", command=self.step)
52 bl.append(b)
53 self.bnext = b = Button(bframe, text="Step over", command=self.next)
54 bl.append(b)
55 self.bret = b = Button(bframe, text="Step out", command=self.ret)
56 bl.append(b)
57 for b in bl:
58 b.configure(state="disabled")
59 b.pack(side="left")
Guido van Rossum35e55da1998-10-14 03:43:05 +000060 self.status = Label(top, anchor="w")
61 self.status.pack(anchor="w")
62 self.error = Label(top, anchor="w")
63 self.error.pack(anchor="w")
Guido van Rossum35f75421998-10-13 23:51:13 +000064
65 def interaction(self, frame, info=None):
Guido van Rossum35e55da1998-10-14 03:43:05 +000066 self.top.pack_propagate(0)
Guido van Rossum35f75421998-10-13 23:51:13 +000067 self.frame = frame
68 code = frame.f_code
69 file = code.co_filename
Guido van Rossum35e55da1998-10-14 03:43:05 +000070 base = os.path.basename(file)
Guido van Rossum35f75421998-10-13 23:51:13 +000071 lineno = frame.f_lineno
Guido van Rossum35e55da1998-10-14 03:43:05 +000072 message = "%s:%s: %s()" % (base, lineno, code.co_name)
73 self.status.configure(text=message)
Guido van Rossum35f75421998-10-13 23:51:13 +000074 if info:
75 type, value, tb = info
Guido van Rossum35e55da1998-10-14 03:43:05 +000076 try:
77 m1 = type.__name__
78 except AttributeError:
79 m1 = "%s" % str(type)
80 if value is not None:
81 try:
82 m1 = "%s: %s" % (m1, str(value))
83 except:
84 pass
85 else:
86 m1 = ""
87 self.error.configure(text=m1)
Guido van Rossum35f75421998-10-13 23:51:13 +000088 if file[:1] + file[-1:] != "<>" and os.path.exists(file):
89 edit = self.flist.open(file)
90 if edit:
91 edit.gotoline(lineno)
92 for b in self.buttons:
93 b.configure(state="normal")
94 self.top.tkraise()
95 self.root.mainloop()
96 for b in self.buttons:
97 b.configure(state="disabled")
98 self.status.configure(text="")
Guido van Rossum35e55da1998-10-14 03:43:05 +000099 self.error.configure(text="")
Guido van Rossum35f75421998-10-13 23:51:13 +0000100 self.frame = None
101
102 def cont(self):
103 self.set_continue()
104 self.root.quit()
105
106 def step(self):
107 self.set_step()
108 self.root.quit()
109
110 def next(self):
111 self.set_next(self.frame)
112 self.root.quit()
113
114 def ret(self):
115 self.set_return(self.frame)
116 self.root.quit()