| 1 | #!/usr/bin/env python |
| 2 | #---------------------------------------------------------------------------- |
| 3 | # Name: run.py |
| 4 | # Purpose: Simple framework for running individual demos |
| 5 | # |
| 6 | # Author: Robin Dunn |
| 7 | # |
| 8 | # Created: 6-March-2000 |
| 9 | # RCS-ID: $Id$ |
| 10 | # Copyright: (c) 2000 by Total Control Software |
| 11 | # Licence: wxWindows license |
| 12 | #---------------------------------------------------------------------------- |
| 13 | |
| 14 | """ |
| 15 | This program will load and run one of the individual demos in this |
| 16 | directory within its own frame window. Just specify the module name |
| 17 | on the command line. |
| 18 | """ |
| 19 | |
| 20 | import wx # This module uses the new wx namespace |
| 21 | import sys, os |
| 22 | |
| 23 | # stuff for debugging |
| 24 | print "wx.VERSION_STRING = %s (%s)" % (wx.VERSION_STRING, wx.USE_UNICODE and 'unicode' or 'ansi') |
| 25 | print "pid:", os.getpid() |
| 26 | ##raw_input("Press Enter...") |
| 27 | |
| 28 | assertMode = wx.PYAPP_ASSERT_DIALOG |
| 29 | ##assertMode = wx.PYAPP_ASSERT_EXCEPTION |
| 30 | |
| 31 | |
| 32 | #---------------------------------------------------------------------------- |
| 33 | |
| 34 | class Log: |
| 35 | def WriteText(self, text): |
| 36 | if text[-1:] == '\n': |
| 37 | text = text[:-1] |
| 38 | wx.LogMessage(text) |
| 39 | write = WriteText |
| 40 | |
| 41 | |
| 42 | class RunDemoApp(wx.App): |
| 43 | def __init__(self, name, module, useShell): |
| 44 | self.name = name |
| 45 | self.demoModule = module |
| 46 | self.useShell = useShell |
| 47 | wx.App.__init__(self, redirect=False) |
| 48 | |
| 49 | |
| 50 | def OnInit(self): |
| 51 | wx.Log_SetActiveTarget(wx.LogStderr()) |
| 52 | |
| 53 | self.SetAssertMode(assertMode) |
| 54 | |
| 55 | frame = wx.Frame(None, -1, "RunDemo: " + self.name, pos=(50,50), size=(200,100), |
| 56 | style=wx.DEFAULT_FRAME_STYLE) |
| 57 | frame.CreateStatusBar() |
| 58 | |
| 59 | menuBar = wx.MenuBar() |
| 60 | menu = wx.Menu() |
| 61 | item = menu.Append(-1, "E&xit\tAlt-X", "Exit demo") |
| 62 | self.Bind(wx.EVT_MENU, self.OnExitApp, item) |
| 63 | menuBar.Append(menu, "&File") |
| 64 | |
| 65 | ns = {} |
| 66 | ns['wx'] = wx |
| 67 | ns['app'] = self |
| 68 | ns['module'] = self.demoModule |
| 69 | ns['frame'] = frame |
| 70 | |
| 71 | frame.SetMenuBar(menuBar) |
| 72 | frame.Show(True) |
| 73 | frame.Bind(wx.EVT_CLOSE, self.OnCloseFrame) |
| 74 | |
| 75 | win = self.demoModule.runTest(frame, frame, Log()) |
| 76 | |
| 77 | # a window will be returned if the demo does not create |
| 78 | # its own top-level window |
| 79 | if win: |
| 80 | # so set the frame to a good size for showing stuff |
| 81 | frame.SetSize((640, 480)) |
| 82 | win.SetFocus() |
| 83 | self.window = win |
| 84 | ns['win'] = win |
| 85 | frect = frame.GetRect() |
| 86 | |
| 87 | else: |
| 88 | # It was probably a dialog or something that is already |
| 89 | # gone, so we're done. |
| 90 | frame.Destroy() |
| 91 | return True |
| 92 | |
| 93 | self.SetTopWindow(frame) |
| 94 | self.frame = frame |
| 95 | #wx.Log_SetActiveTarget(wx.LogStderr()) |
| 96 | #wx.Log_SetTraceMask(wx.TraceMessages) |
| 97 | |
| 98 | if self.useShell: |
| 99 | # Make a PyShell window, and position it below our test window |
| 100 | from wx import py |
| 101 | shell = py.shell.ShellFrame(None, locals=ns) |
| 102 | frect.OffsetXY(0, frect.height) |
| 103 | frect.height = 400 |
| 104 | shell.SetRect(frect) |
| 105 | shell.Show() |
| 106 | |
| 107 | # Hook the close event of the test window so that we close |
| 108 | # the shell at the same time |
| 109 | def CloseShell(evt): |
| 110 | if shell: |
| 111 | shell.Close() |
| 112 | evt.Skip() |
| 113 | frame.Bind(wx.EVT_CLOSE, CloseShell) |
| 114 | |
| 115 | return True |
| 116 | |
| 117 | |
| 118 | def OnExitApp(self, evt): |
| 119 | self.frame.Close(True) |
| 120 | |
| 121 | |
| 122 | def OnCloseFrame(self, evt): |
| 123 | if hasattr(self, "window") and hasattr(self.window, "ShutdownDemo"): |
| 124 | self.window.ShutdownDemo() |
| 125 | evt.Skip() |
| 126 | |
| 127 | |
| 128 | #---------------------------------------------------------------------------- |
| 129 | |
| 130 | |
| 131 | def main(argv): |
| 132 | useShell = False |
| 133 | for x in range(len(sys.argv)): |
| 134 | if sys.argv[x] in ['--shell', '-shell', '-s']: |
| 135 | useShell = True |
| 136 | del sys.argv[x] |
| 137 | break |
| 138 | |
| 139 | if len(argv) < 2: |
| 140 | print "Please specify a demo module name on the command-line" |
| 141 | raise SystemExit |
| 142 | |
| 143 | name, ext = os.path.splitext(argv[1]) |
| 144 | module = __import__(name) |
| 145 | |
| 146 | |
| 147 | app = RunDemoApp(name, module, useShell) |
| 148 | app.MainLoop() |
| 149 | |
| 150 | |
| 151 | |
| 152 | if __name__ == "__main__": |
| 153 | main(sys.argv) |
| 154 | |
| 155 | |