1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
|
"""
Support class that wraps up the boilerplate toolkit calls that virtually all
demo programs have to use.
"""
from enthought.etsconfig.api import ETSConfig
# FIXME - it should be enough to do the following import, but because of the
# PyQt/traits problem (see below) we can't because it would drag in traits too
# early. Until it is fixed we just assume wx if we can import it.
# Force the selection of a valid toolkit.
#import enthought.enable.toolkit
if not ETSConfig.enable_toolkit:
if ETSConfig.toolkit:
# Set the enable_toolkit to the same value as the GUI toolkit
try:
exec "import enthought.enable.%s_backend" % ETSConfig.toolkit
ETSConfig.enable_toolkit = ETSConfig.toolkit
except (ImportError, SyntaxError):
raise RuntimeError("Can't determine appropriate Enable backend for ETS toolkit '%s'; "
"Please set $ENABLE_TOOLKIT or ETSConfig.enable_toolkit." % ETSConfig.toolkit)
else:
for toolkit, toolkit_module in (('wx', 'wx'), ('qt4', 'PyQt4')):
try:
exec "import " + toolkit_module
ETSConfig.enable_toolkit = toolkit
break
except ImportError:
pass
else:
raise RuntimeError("Can't load wx or qt4 backend for Chaco.")
if ETSConfig.enable_toolkit == 'wx':
import wx
class DemoFrame(wx.Frame):
def __init__ ( self, *args, **kw ):
wx.Frame.__init__( *(self,) + args, **kw )
#self.SetTitle("Enable Demo")
self.SetAutoLayout( True )
# Create the subclass's window
self.enable_win = self._create_window()
# Listen for the Activate event so we can restore keyboard focus.
wx.EVT_ACTIVATE( self, self._on_activate )
sizer = wx.BoxSizer(wx.HORIZONTAL)
sizer.Add(self.enable_win.control, 1, wx.EXPAND)
self.SetSizer(sizer)
self.Show( True )
return
def _on_activate(self, event):
if self.enable_win is not None and self.enable_win.control is not None:
self.enable_win.control.SetFocus()
def _create_window(self):
"Subclasses should override this method and return an enable.Window"
raise NotImplementedError
def demo_main(demo_class, size=(400,400), title="Enable Demo"):
"Takes the class of the demo to run as an argument."
app = wx.GetApp()
if app is None:
app = wx.PySimpleApp()
frame = demo_class(None, size=size, title=title)
app.SetTopWindow(frame)
app.MainLoop()
elif ETSConfig.enable_toolkit == 'qt4':
from PyQt4 import QtGui
_app = QtGui.QApplication.instance()
if _app is None:
import sys
_app = QtGui.QApplication(sys.argv)
class DemoFrame(QtGui.QWidget):
def __init__ (self, parent, **kw):
QtGui.QWidget.__init__(self)
# Create the subclass's window
self.enable_win = self._create_window()
layout = QtGui.QVBoxLayout()
layout.setMargin(0)
layout.addWidget(self.enable_win.control)
self.setLayout(layout)
if 'size' in kw:
self.resize(*kw['size'])
if 'title' in kw:
self.setWindowTitle(kw['title'])
self.show()
def _create_window(self):
"Subclasses should override this method and return an enable.Window"
raise NotImplementedError
def demo_main(demo_class, size=(400,400), title="Enable Demo"):
"Takes the class of the demo to run as an argument."
frame = demo_class(None, size=size, title=title)
_app.exec_()
elif ETSConfig.enable_toolkit == 'pyglet':
from pyglet import app
from pyglet import clock
class DemoFrame(object):
def __init__(self):
if app:
window = self._create_window()
if window:
self.enable_win = window
else:
self.enable_win = None
return
def _create_window(self):
raise NotImplementedError
def demo_main(demo_class, size=(640,480), title="Enable Example"):
""" Runs a simple application in Pyglet using an instance of
**demo_class** as the main window or frame.
**demo_class** should be a subclass of DemoFrame or the pyglet
backend's Window class.
"""
if issubclass(demo_class, DemoFrame):
frame = demo_class()
if frame.enable_win is not None:
window = frame.enable_win.control
else:
window = None
else:
window = demo_class().control
if window is not None:
if not window.fullscreen:
window.set_size(*size)
window.set_caption(title)
app.run()
# EOF
|