home *** CD-ROM | disk | FTP | other *** search
/ MacHack 2000 / MacHack 2000.toast / pc / The Hacks / MacHacksBug / Python 1.5.2c1 / Mac / Tools / IDE / ProfileBrowser.py < prev    next >
Encoding:
Python Source  |  2000-06-23  |  2.8 KB  |  92 lines

  1. import W
  2. import Evt
  3.  
  4. import sys
  5. import StringIO
  6. import string
  7. import pstats, fpformat
  8.  
  9. # increase precision
  10. def f8(x):
  11.     return string.rjust(fpformat.fix(x, 4), 8)
  12. pstats.f8 = f8
  13.  
  14. # hacking around a hack
  15. if sys.version[:3] > '1.4':
  16.     timer = Evt.TickCount
  17. else:
  18.     def timer(TickCount = Evt.TickCount):
  19.         return TickCount() / 60.0
  20.  
  21. class ProfileBrowser:
  22.     
  23.     def __init__(self, stats = None):
  24.         self.sortkeys = ('calls',)
  25.         self.setupwidgets()
  26.         self.setstats(stats)
  27.     
  28.     def setupwidgets(self): 
  29.         self.w = W.Window((580, 400), "Profile Statistics", minsize = (200, 100), tabbable = 0)
  30.         self.w.divline = W.HorizontalLine((0, 20, 0, 0))
  31.         self.w.titlebar = W.TextBox((4, 4, 40, 12), 'Sort by:')
  32.         self.buttons = []
  33.         self.w.button_calls = W.RadioButton((54, 4, 45, 12), 'calls', self.buttons, self.setsort)
  34.         self.w.button_time = W.RadioButton((104, 4, 40, 12), 'time', self.buttons, self.setsort)
  35.         self.w.button_cumulative = W.RadioButton((154, 4, 75, 12), 'cumulative', self.buttons, self.setsort)
  36.         self.w.button_stdname = W.RadioButton((234, 4, 60, 12), 'stdname', self.buttons, self.setsort)
  37.         self.w.button_calls.set(1)
  38.         self.w.button_file = W.RadioButton((304, 4, 40, 12), 'file', self.buttons, self.setsort)
  39.         self.w.button_line = W.RadioButton((354, 4, 50, 12), 'line', self.buttons, self.setsort)
  40.         self.w.button_name = W.RadioButton((404, 4, 50, 12), 'name', self.buttons, self.setsort)
  41. ##        self.w.button_nfl = W.RadioButton((4, 4, 12, 12), 'nfl', self.buttons, self.setsort)
  42. ##        self.w.button_pcalls = W.RadioButton((4, 4, 12, 12), 'pcalls', self.buttons, self.setsort)
  43.         self.w.text = W.TextEditor((0, 21, -15, -15), inset = (6, 5), 
  44.                 readonly = 1, wrap = 0, fontsettings = ('Monaco', 0, 9, (0, 0, 0)))
  45.         self.w._bary = W.Scrollbar((-15, 20, 16, -14), self.w.text.vscroll, max = 32767)
  46.         self.w._barx = W.Scrollbar((-1, -15, -14, 16), self.w.text.hscroll, max = 32767)
  47.         self.w.open()
  48.     
  49.     def setstats(self, stats):
  50.         self.stats = stats
  51.         self.stats.strip_dirs()
  52.         self.displaystats()
  53.     
  54.     def setsort(self):
  55.         # Grmpf. The callback doesn't give us the button:-(
  56.         for b in self.buttons:
  57.             if b.get():
  58.                 if b._title == self.sortkeys[0]:
  59.                     return
  60.                 self.sortkeys = (b._title,) + self.sortkeys[:3]
  61.                 break
  62.         self.displaystats()
  63.     
  64.     def displaystats(self):
  65.         W.SetCursor('watch')
  66.         apply(self.stats.sort_stats, self.sortkeys)
  67.         saveout = sys.stdout
  68.         try:
  69.             s = sys.stdout = StringIO.StringIO()
  70.             self.stats.print_stats()
  71.         finally:
  72.             sys.stdout = saveout
  73.         text = string.join(string.split(s.getvalue(), '\n'), '\r')
  74.         self.w.text.set(text)
  75.  
  76.  
  77. def main():
  78.     import pstats
  79.     args = sys.argv[1:]
  80.     for i in args:
  81.         stats = pstats.Stats(i)
  82.         browser = ProfileBrowser(stats)
  83.     else:
  84.         import macfs
  85.         fss, ok = macfs.PromptGetFile('Profiler data')
  86.         if not ok: sys.exit(0)
  87.         stats = pstats.Stats(fss.as_pathname())
  88.         browser = ProfileBrowser(stats)
  89.  
  90. if __name__ == '__main__':
  91.     main()
  92.