| 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 | |
| 21 | import sys |
| 22 | from wxPython.wx import * |
| 23 | |
| 24 | #---------------------------------------------------------------------------- |
| 25 | |
| 26 | class Log: |
| 27 | def WriteText(self, text): |
| 28 | sys.stdout.write(text) |
| 29 | write = WriteText |
| 30 | |
| 31 | |
| 32 | class RunDemoApp(wxApp): |
| 33 | def __init__(self, name, module): |
| 34 | self.name = name |
| 35 | self.demoModule = module |
| 36 | wxApp.__init__(self, 0) |
| 37 | |
| 38 | def OnInit(self): |
| 39 | wxInitAllImageHandlers() |
| 40 | frame = wxFrame(None, -1, "RunDemo: " + self.name, size=(0,0), |
| 41 | style=wxNO_FULL_REPAINT_ON_RESIZE|wxDEFAULT_FRAME_STYLE) |
| 42 | frame.CreateStatusBar() |
| 43 | menuBar = wxMenuBar() |
| 44 | menu = wxMenu() |
| 45 | menu.Append(101, "E&xit\tAlt-X", "Exit demo") |
| 46 | EVT_MENU(self, 101, self.OnButton) |
| 47 | menuBar.Append(menu, "&File") |
| 48 | frame.SetMenuBar(menuBar) |
| 49 | frame.Show(true) |
| 50 | win = self.demoModule.runTest(frame, frame, Log()) |
| 51 | |
| 52 | # a window will be returned if the demo does not create |
| 53 | # its own top-level window |
| 54 | if win: |
| 55 | # so set the frame to a good size for showing stuff |
| 56 | frame.SetSize((640, 480)) |
| 57 | win.SetFocus() |
| 58 | |
| 59 | else: |
| 60 | # otherwise the demo made its own frame, so just put a |
| 61 | # button in this one |
| 62 | if hasattr(frame, 'otherWin'): |
| 63 | wxButton(frame, 1101, " Exit ") |
| 64 | frame.SetSize((200, 100)) |
| 65 | EVT_BUTTON(frame, 1101, self.OnButton) |
| 66 | else: |
| 67 | # It was probably a dialog or something that is already |
| 68 | # gone, so we're done. |
| 69 | frame.Destroy() |
| 70 | return true |
| 71 | |
| 72 | self.SetTopWindow(frame) |
| 73 | self.frame = frame |
| 74 | return true |
| 75 | |
| 76 | |
| 77 | def OnButton(self, evt): |
| 78 | self.frame.Close(true) |
| 79 | |
| 80 | #---------------------------------------------------------------------------- |
| 81 | |
| 82 | |
| 83 | def main(argv): |
| 84 | if len(argv) != 2: |
| 85 | print "Please specify a demo module name on the command-line" |
| 86 | raise SystemExit |
| 87 | |
| 88 | name = argv[1] |
| 89 | if name[-3:] == '.py': |
| 90 | name = name[:-3] |
| 91 | module = __import__(name) |
| 92 | |
| 93 | |
| 94 | app = RunDemoApp(name, module) |
| 95 | app.MainLoop() |
| 96 | |
| 97 | |
| 98 | |
| 99 | if __name__ == "__main__": |
| 100 | main(sys.argv) |
| 101 | |
| 102 | |