import wx # requires wxPython
import sys # required to redirect the output
class EditorSashWindow(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent, -1)
winids = []
# Left window has fixed size and contains control buttons
self.controls = wx.SashLayoutWindow(self, -1)
winids.append(self.controls.GetId())
self.controls.SetDefaultSize((80, 600))
self.controls.SetOrientation(wx.LAYOUT_VERTICAL)
self.controls.SetAlignment(wx.LAYOUT_LEFT)
b = wx.Button(self.controls, -1, "Open", (3, 20))
self.Bind(wx.EVT_BUTTON, self.openFile, b)
b.SetDefault()
b2 = wx.Button(self.controls, -1, "Save", (3, 60))
self.Bind(wx.EVT_BUTTON, self.saveFile, b2)
b2.SetDefault()
b3 = wx.Button(self.controls, -1, "Run", (3, 100))
self.Bind(wx.EVT_BUTTON, self.run, b3)
b3.SetDefault()
b4 = wx.Button(self.controls, -1, "Clear", (3, 140))
self.Bind(wx.EVT_BUTTON, self.clear, b4)
b4.SetDefault()
# This will occupy the space not used by the Layout Algorithm
self.remainingSpace = wx.SashLayoutWindow(
self, -1, style=wx.NO_BORDER|wx.SW_3D)
self.python_editor = wx.TextCtrl(self.remainingSpace,
-1, "", wx.DefaultPosition, wx.DefaultSize,
wx.TE_MULTILINE|wx.SUNKEN_BORDER
)
self.python_editor.SetValue("#Editor window")
# The output window is at the extreme right
win = wx.SashLayoutWindow(
self, -1, wx.DefaultPosition, (200, 30),
wx.NO_BORDER|wx.SW_3D
)
winids.append(win.GetId())
win.SetDefaultSize((300, 600))
win.SetOrientation(wx.LAYOUT_VERTICAL)
win.SetAlignment(wx.LAYOUT_RIGHT)
win.SetSashVisible(wx.SASH_LEFT, True)
win.SetExtraBorderSize(10)
self.rightWindow = win
self.output_window = wx.TextCtrl(win, -1, "", wx.DefaultPosition,
wx.DefaultSize, wx.TE_MULTILINE|wx.SUNKEN_BORDER)
self.output_window.SetValue("Output Window\n")
#redirecting output
sys.stdout = self.output_window
sys.stderr = self.output_window
self.Bind(wx.EVT_SASH_DRAGGED_RANGE, self.OnSashDrag, id=min(winids),
id2=max(winids))
self.Bind(wx.EVT_SIZE, self.OnSize)
def OnSashDrag(self, event):
eobj = event.GetEventObject()
if eobj is self.rightWindow:
self.rightWindow.SetDefaultSize((event.GetDragRect().width, 600))
wx.LayoutAlgorithm().LayoutWindow(self, self.remainingSpace)
self.remainingSpace.Refresh()
def OnSize(self, event):
wx.LayoutAlgorithm().LayoutWindow(self, self.remainingSpace)
def saveFile(self, event):
self.output_window.SetValue("Save File not implemented")
def openFile(self, event):
self.output_window.SetValue("Open File not implemented")
def run(self, event):
'''Runs the user code; input() and raw_input() are implemented
with dialogs.'''
user_code = self.python_editor.GetValue()
myGlobals = globals()
myGlobals['raw_input'] = self.myRawInput
myGlobals['input'] = self.myInput
exec user_code in myGlobals
def clear(self, event):
'''Clears the output window'''
self.output_window.SetValue("")
def myRawInput(self, text):
dlg = wx.TextEntryDialog(self, text, 'raw_input() request', '')
if dlg.ShowModal() == wx.ID_OK:
user_response = dlg.GetValue()
dlg.Destroy()
return user_response
def myInput(self, text):
dlg = wx.TextEntryDialog(self, text, 'input() request', '')
if dlg.ShowModal() == wx.ID_OK:
user_response = dlg.GetValue()
dlg.Destroy()
return eval(user_response)
class MainWindow(wx.Frame):
def __init__(self, parent, title):
wx.Frame.__init__(self,parent, -1, title, size=(800, 600),
style=wx.DEFAULT_FRAME_STYLE|wx.NO_FULL_REPAINT_ON_RESIZE)
self.app = EditorSashWindow(self)
self.Show(True)
app = wx.PySimpleApp()
frame=MainWindow(None, 'Lightning Compiler')
app.MainLoop()