Guido van Rossum | 35f7542 | 1998-10-13 23:51:13 +0000 | [diff] [blame] | 1 | import os |
| 2 | import bdb |
| 3 | import traceback |
| 4 | from Tkinter import * |
| 5 | |
| 6 | |
| 7 | class Debugger(bdb.Bdb): |
| 8 | |
Guido van Rossum | 35e55da | 1998-10-14 03:43:05 +0000 | [diff] [blame] | 9 | interacting = 0 |
| 10 | |
Guido van Rossum | 35f7542 | 1998-10-13 23:51:13 +0000 | [diff] [blame] | 11 | def __init__(self, pyshell): |
| 12 | bdb.Bdb.__init__(self) |
| 13 | self.pyshell = pyshell |
| 14 | self.make_gui() |
| 15 | |
| 16 | def close(self): |
Guido van Rossum | 35e55da | 1998-10-14 03:43:05 +0000 | [diff] [blame] | 17 | if self.interacting: |
| 18 | self.top.bell() |
| 19 | return |
| 20 | self.pyshell.close_debugger() |
Guido van Rossum | 35f7542 | 1998-10-13 23:51:13 +0000 | [diff] [blame] | 21 | self.top.destroy() |
Guido van Rossum | 35e55da | 1998-10-14 03:43:05 +0000 | [diff] [blame] | 22 | |
| 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 Rossum | 35f7542 | 1998-10-13 23:51:13 +0000 | [diff] [blame] | 29 | |
| 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 Rossum | 35e55da | 1998-10-14 03:43:05 +0000 | [diff] [blame] | 45 | top.wm_protocol("WM_DELETE_WINDOW", self.close) |
Guido van Rossum | 35f7542 | 1998-10-13 23:51:13 +0000 | [diff] [blame] | 46 | self.bframe = bframe = Frame(top) |
Guido van Rossum | 35e55da | 1998-10-14 03:43:05 +0000 | [diff] [blame] | 47 | self.bframe.pack(anchor="w") |
Guido van Rossum | 35f7542 | 1998-10-13 23:51:13 +0000 | [diff] [blame] | 48 | 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 Rossum | 35e55da | 1998-10-14 03:43:05 +0000 | [diff] [blame] | 60 | 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 Rossum | 35f7542 | 1998-10-13 23:51:13 +0000 | [diff] [blame] | 64 | |
| 65 | def interaction(self, frame, info=None): |
Guido van Rossum | 35e55da | 1998-10-14 03:43:05 +0000 | [diff] [blame] | 66 | self.top.pack_propagate(0) |
Guido van Rossum | 35f7542 | 1998-10-13 23:51:13 +0000 | [diff] [blame] | 67 | self.frame = frame |
| 68 | code = frame.f_code |
| 69 | file = code.co_filename |
Guido van Rossum | 35e55da | 1998-10-14 03:43:05 +0000 | [diff] [blame] | 70 | base = os.path.basename(file) |
Guido van Rossum | 35f7542 | 1998-10-13 23:51:13 +0000 | [diff] [blame] | 71 | lineno = frame.f_lineno |
Guido van Rossum | 35e55da | 1998-10-14 03:43:05 +0000 | [diff] [blame] | 72 | message = "%s:%s: %s()" % (base, lineno, code.co_name) |
| 73 | self.status.configure(text=message) |
Guido van Rossum | 35f7542 | 1998-10-13 23:51:13 +0000 | [diff] [blame] | 74 | if info: |
| 75 | type, value, tb = info |
Guido van Rossum | 35e55da | 1998-10-14 03:43:05 +0000 | [diff] [blame] | 76 | 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 Rossum | 35f7542 | 1998-10-13 23:51:13 +0000 | [diff] [blame] | 88 | 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 Rossum | 35e55da | 1998-10-14 03:43:05 +0000 | [diff] [blame] | 99 | self.error.configure(text="") |
Guido van Rossum | 35f7542 | 1998-10-13 23:51:13 +0000 | [diff] [blame] | 100 | 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() |