2000-07-15 15:51:35 -04:00
|
|
|
#!/usr/bin/env python
|
2000-03-10 22:20:42 -05:00
|
|
|
#----------------------------------------------------------------------------
|
|
|
|
# Name: run.py
|
|
|
|
# Purpose: Simple framework for running individual demos
|
|
|
|
#
|
|
|
|
# Author: Robin Dunn
|
|
|
|
#
|
|
|
|
# Created: 6-March-2000
|
|
|
|
# RCS-ID: $Id$
|
|
|
|
# Copyright: (c) 2000 by Total Control Software
|
|
|
|
# Licence: wxWindows license
|
|
|
|
#----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
"""
|
|
|
|
This program will load and run one of the individual demos in this
|
|
|
|
directory within its own frame window. Just specify the module name
|
|
|
|
on the command line.
|
|
|
|
"""
|
|
|
|
|
2003-07-02 19:13:10 -04:00
|
|
|
import wx # This module uses the new wx namespace
|
2003-12-02 22:26:20 -05:00
|
|
|
import sys, os
|
|
|
|
|
|
|
|
# stuff for debugging
|
2003-07-31 15:21:05 -04:00
|
|
|
print "wx.VERSION_STRING = ", wx.VERSION_STRING
|
2003-12-02 22:26:20 -05:00
|
|
|
print "pid:", os.getpid()
|
|
|
|
##raw_input("Press a key...")
|
2000-03-10 22:20:42 -05:00
|
|
|
|
2003-11-12 16:34:20 -05:00
|
|
|
assertMode = wx.PYAPP_ASSERT_DIALOG
|
|
|
|
##assertMode = wx.PYAPP_ASSERT_EXCEPTION
|
|
|
|
|
2000-03-10 22:20:42 -05:00
|
|
|
|
|
|
|
#----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
class Log:
|
|
|
|
def WriteText(self, text):
|
2003-03-25 01:35:27 -05:00
|
|
|
if text[-1:] == '\n':
|
|
|
|
text = text[:-1]
|
2003-07-02 19:13:10 -04:00
|
|
|
wx.LogMessage(text)
|
2000-03-10 22:20:42 -05:00
|
|
|
write = WriteText
|
|
|
|
|
|
|
|
|
2003-07-02 19:13:10 -04:00
|
|
|
class RunDemoApp(wx.App):
|
2004-03-04 19:06:33 -05:00
|
|
|
def __init__(self, name, module, useShell):
|
2000-03-10 22:20:42 -05:00
|
|
|
self.name = name
|
|
|
|
self.demoModule = module
|
2004-03-04 19:06:33 -05:00
|
|
|
self.useShell = useShell
|
2003-07-02 19:13:10 -04:00
|
|
|
wx.App.__init__(self, 0)
|
2002-05-15 01:05:02 -04:00
|
|
|
|
2000-03-10 22:20:42 -05:00
|
|
|
|
|
|
|
def OnInit(self):
|
2003-07-02 19:13:10 -04:00
|
|
|
wx.InitAllImageHandlers()
|
|
|
|
wx.Log_SetActiveTarget(wx.LogStderr())
|
2003-03-25 01:35:27 -05:00
|
|
|
|
2003-11-12 16:34:20 -05:00
|
|
|
self.SetAssertMode(assertMode)
|
2003-07-02 19:13:10 -04:00
|
|
|
|
2003-11-22 17:57:49 -05:00
|
|
|
frame = wx.Frame(None, -1, "RunDemo: " + self.name, pos=(50,50), size=(200,100),
|
2004-04-07 15:50:27 -04:00
|
|
|
style=wx.DEFAULT_FRAME_STYLE)
|
2000-03-10 22:20:42 -05:00
|
|
|
frame.CreateStatusBar()
|
2004-02-06 17:14:22 -05:00
|
|
|
|
2003-07-02 19:13:10 -04:00
|
|
|
menuBar = wx.MenuBar()
|
|
|
|
menu = wx.Menu()
|
2004-02-06 17:14:22 -05:00
|
|
|
item = menu.Append(-1, "E&xit\tAlt-X", "Exit demo")
|
|
|
|
self.Bind(wx.EVT_MENU, self.OnButton, item)
|
2001-10-17 01:29:57 -04:00
|
|
|
menuBar.Append(menu, "&File")
|
2004-02-06 17:14:22 -05:00
|
|
|
|
2004-03-04 19:06:33 -05:00
|
|
|
ns = {}
|
2004-03-05 18:57:45 -05:00
|
|
|
ns['wx'] = wx
|
2004-03-04 19:06:33 -05:00
|
|
|
ns['app'] = self
|
|
|
|
ns['module'] = self.demoModule
|
|
|
|
ns['frame'] = frame
|
|
|
|
|
2001-10-17 01:29:57 -04:00
|
|
|
frame.SetMenuBar(menuBar)
|
2003-03-25 01:35:27 -05:00
|
|
|
frame.Show(True)
|
2004-02-06 17:14:22 -05:00
|
|
|
frame.Bind(wx.EVT_CLOSE, self.OnCloseFrame)
|
2003-03-25 01:35:27 -05:00
|
|
|
|
2000-03-10 22:20:42 -05:00
|
|
|
win = self.demoModule.runTest(frame, frame, Log())
|
|
|
|
|
|
|
|
# a window will be returned if the demo does not create
|
|
|
|
# its own top-level window
|
|
|
|
if win:
|
|
|
|
# so set the frame to a good size for showing stuff
|
2000-07-15 15:51:35 -04:00
|
|
|
frame.SetSize((640, 480))
|
|
|
|
win.SetFocus()
|
2003-03-25 01:35:27 -05:00
|
|
|
self.window = win
|
2004-03-04 19:06:33 -05:00
|
|
|
ns['win'] = win
|
|
|
|
frect = frame.GetRect()
|
2000-03-10 22:20:42 -05:00
|
|
|
|
|
|
|
else:
|
|
|
|
# otherwise the demo made its own frame, so just put a
|
|
|
|
# button in this one
|
|
|
|
if hasattr(frame, 'otherWin'):
|
2004-03-04 19:06:33 -05:00
|
|
|
ns['win'] = frame.otherWin
|
|
|
|
frect = frame.otherWin.GetRect()
|
2003-11-12 16:34:20 -05:00
|
|
|
p = wx.Panel(frame, -1)
|
|
|
|
b = wx.Button(p, -1, " Exit ", (10,10))
|
2004-03-15 18:09:18 -05:00
|
|
|
wx.CallAfter(frame.SetClientSize, (200, 100))
|
2004-02-06 17:14:22 -05:00
|
|
|
frame.Bind(wx.EVT_BUTTON, self.OnButton, b)
|
2000-03-10 22:20:42 -05:00
|
|
|
else:
|
|
|
|
# It was probably a dialog or something that is already
|
|
|
|
# gone, so we're done.
|
|
|
|
frame.Destroy()
|
2003-03-25 01:35:27 -05:00
|
|
|
return True
|
2000-03-10 22:20:42 -05:00
|
|
|
|
|
|
|
self.SetTopWindow(frame)
|
|
|
|
self.frame = frame
|
2003-07-02 19:13:10 -04:00
|
|
|
#wx.Log_SetActiveTarget(wx.LogStderr())
|
|
|
|
#wx.Log_SetTraceMask(wx.TraceMessages)
|
2004-03-04 19:06:33 -05:00
|
|
|
|
|
|
|
if self.useShell:
|
|
|
|
# Make a PyShell window, and position it below our test window
|
|
|
|
from wx import py
|
|
|
|
shell = py.shell.ShellFrame(None, locals=ns)
|
|
|
|
frect.OffsetXY(0, frect.height)
|
|
|
|
frect.height = 400
|
|
|
|
shell.SetRect(frect)
|
|
|
|
shell.Show()
|
|
|
|
|
|
|
|
# Hook the close event of the test window so that we close
|
|
|
|
# the shell at the same time
|
|
|
|
def CloseShell(evt):
|
2004-03-05 18:38:39 -05:00
|
|
|
if shell:
|
|
|
|
shell.Close()
|
2004-03-04 19:06:33 -05:00
|
|
|
evt.Skip()
|
|
|
|
frame.Bind(wx.EVT_CLOSE, CloseShell)
|
|
|
|
|
2003-03-25 01:35:27 -05:00
|
|
|
return True
|
2000-03-10 22:20:42 -05:00
|
|
|
|
|
|
|
|
|
|
|
def OnButton(self, evt):
|
2003-03-25 01:35:27 -05:00
|
|
|
self.frame.Close(True)
|
|
|
|
|
|
|
|
|
|
|
|
def OnCloseFrame(self, evt):
|
|
|
|
if hasattr(self, "window") and hasattr(self.window, "ShutdownDemo"):
|
|
|
|
self.window.ShutdownDemo()
|
|
|
|
evt.Skip()
|
|
|
|
|
2000-03-10 22:20:42 -05:00
|
|
|
|
|
|
|
#----------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
2000-03-11 02:24:00 -05:00
|
|
|
def main(argv):
|
2004-03-04 19:06:33 -05:00
|
|
|
useShell = False
|
|
|
|
for x in range(len(sys.argv)):
|
|
|
|
if sys.argv[x] in ['--shell', '-shell', '-s']:
|
|
|
|
useShell = True
|
|
|
|
del sys.argv[x]
|
|
|
|
break
|
|
|
|
|
2002-08-16 15:44:51 -04:00
|
|
|
if len(argv) < 2:
|
2000-03-10 22:20:42 -05:00
|
|
|
print "Please specify a demo module name on the command-line"
|
|
|
|
raise SystemExit
|
|
|
|
|
2004-01-26 17:45:58 -05:00
|
|
|
name, ext = os.path.splitext(argv[1])
|
2000-03-10 22:20:42 -05:00
|
|
|
module = __import__(name)
|
|
|
|
|
|
|
|
|
2004-03-04 19:06:33 -05:00
|
|
|
app = RunDemoApp(name, module, useShell)
|
2000-03-10 22:20:42 -05:00
|
|
|
app.MainLoop()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
2000-03-11 02:24:00 -05:00
|
|
|
main(sys.argv)
|
2000-03-10 22:20:42 -05:00
|
|
|
|
|
|
|
|