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 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266
|
#!/usr/bin/python
# -*- coding: iso-8859-15 -*-
import wx.aui
import sys
#used for about dialog
from wx.lib.wordwrap import wordwrap
#used for ipython GUI objects
from IPython.gui.wx.ipython_view import IPShellWidget
from IPython.gui.wx.ipython_history import IPythonHistoryPanel
#used to invoke ipython1 wx implementation
### FIXME ### temporary disabled due to interference with 'show_in_pager' hook
is_sync_frontend_ok = False
try:
from IPython.frontend.wx.ipythonx import IPythonXController
except ImportError:
is_sync_frontend_ok = False
#used to create options.conf file in user directory
from IPython.core.ipapi import get
__version__ = 0.91
__author__ = "Laurent Dufrechou"
__email__ = "laurent.dufrechou _at_ gmail.com"
__license__ = "BSD"
#-----------------------------------------
# Creating one main frame for our
# application with movables windows
#-----------------------------------------
class MyFrame(wx.Frame):
"""Creating one main frame for our
application with movables windows"""
def __init__(self, parent=None, id=-1, title="WxIPython",
pos=wx.DefaultPosition,
size=(800, 600), style=wx.DEFAULT_FRAME_STYLE, sync_ok=False):
wx.Frame.__init__(self, parent, id, title, pos, size, style)
self._mgr = wx.aui.AuiManager()
# notify PyAUI which frame to use
self._mgr.SetManagedWindow(self)
#create differents panels and make them persistant
self.history_panel = IPythonHistoryPanel(self)
self.history_panel.setOptionTrackerHook(self.optionSave)
self.ipython_panel = IPShellWidget(self,background_color = "BLACK")
#self.ipython_panel = IPShellWidget(self,background_color = "WHITE")
if(sync_ok):
self.ipython_panel2 = IPythonXController(self)
else:
self.ipython_panel2 = None
self.ipython_panel.setHistoryTrackerHook(self.history_panel.write)
self.ipython_panel.setStatusTrackerHook(self.updateStatus)
self.ipython_panel.setAskExitHandler(self.OnExitDlg)
self.ipython_panel.setOptionTrackerHook(self.optionSave)
#Create a notebook to display different IPython shell implementations
self.nb = wx.aui.AuiNotebook(self)
self.optionLoad()
self.statusbar = self.createStatus()
self.createMenu()
########################################################################
### add the panes to the manager
# main panels
self._mgr.AddPane(self.nb , wx.CENTER, "IPython Shells")
self.nb.AddPage(self.ipython_panel , "IPython0 Shell")
if(sync_ok):
self.nb.AddPage(self.ipython_panel2, "IPython1 Synchroneous Shell")
self._mgr.AddPane(self.history_panel , wx.RIGHT, "IPython history")
# now we specify some panel characteristics
self._mgr.GetPane(self.ipython_panel).CaptionVisible(True);
self._mgr.GetPane(self.history_panel).CaptionVisible(True);
self._mgr.GetPane(self.history_panel).MinSize((200,400));
# tell the manager to "commit" all the changes just made
self._mgr.Update()
#global event handling
self.Bind(wx.EVT_CLOSE, self.OnClose)
self.Bind(wx.EVT_MENU, self.OnClose,id=wx.ID_EXIT)
self.Bind(wx.EVT_MENU, self.OnShowIPythonPanel,id=wx.ID_HIGHEST+1)
self.Bind(wx.EVT_MENU, self.OnShowHistoryPanel,id=wx.ID_HIGHEST+2)
self.Bind(wx.EVT_MENU, self.OnShowAbout, id=wx.ID_HIGHEST+3)
self.Bind(wx.EVT_MENU, self.OnShowAllPanel,id=wx.ID_HIGHEST+6)
warn_text = 'Hello from IPython and wxPython.\n'
warn_text +='Please Note that this work is still EXPERIMENTAL\n'
warn_text +='It does NOT emulate currently all the IPython functions.\n'
warn_text +="\nIf you use MATPLOTLIB with show() you'll need to deactivate the THREADING option.\n"
if(not sync_ok):
warn_text +="\n->No twisted package detected, IPython1 example deactivated."
dlg = wx.MessageDialog(self,
warn_text,
'Warning Box',
wx.OK | wx.ICON_INFORMATION
)
dlg.ShowModal()
dlg.Destroy()
def optionSave(self, name, value):
ip = get()
path = ip.ipython_dir
opt = open(path + '/options.conf','w')
try:
options_ipython_panel = self.ipython_panel.getOptions()
options_history_panel = self.history_panel.getOptions()
for key in options_ipython_panel.keys():
opt.write(key + '=' + options_ipython_panel[key]['value']+'\n')
for key in options_history_panel.keys():
opt.write(key + '=' + options_history_panel[key]['value']+'\n')
finally:
opt.close()
def optionLoad(self):
try:
ip = get()
path = ip.ipython_dir
opt = open(path + '/options.conf','r')
lines = opt.readlines()
opt.close()
options_ipython_panel = self.ipython_panel.getOptions()
options_history_panel = self.history_panel.getOptions()
for line in lines:
key = line.split('=')[0]
value = line.split('=')[1].replace('\n','').replace('\r','')
if key in options_ipython_panel.keys():
options_ipython_panel[key]['value'] = value
elif key in options_history_panel.keys():
options_history_panel[key]['value'] = value
else:
print >>sys.__stdout__,"Warning: key ",key,"not found in widget options. Check Options.conf"
self.ipython_panel.reloadOptions(options_ipython_panel)
self.history_panel.reloadOptions(options_history_panel)
except IOError:
print >>sys.__stdout__,"Could not open Options.conf, defaulting to default values."
def createMenu(self):
"""local method used to create one menu bar"""
mb = wx.MenuBar()
file_menu = wx.Menu()
file_menu.Append(wx.ID_EXIT, "Exit")
view_menu = wx.Menu()
view_menu.Append(wx.ID_HIGHEST+1, "Show IPython Panel")
view_menu.Append(wx.ID_HIGHEST+2, "Show History Panel")
view_menu.AppendSeparator()
view_menu.Append(wx.ID_HIGHEST+6, "Show All")
about_menu = wx.Menu()
about_menu.Append(wx.ID_HIGHEST+3, "About")
mb.Append(file_menu, "File")
mb.Append(view_menu, "View")
mb.Append(about_menu, "About")
#mb.Append(options_menu, "Options")
self.SetMenuBar(mb)
def createStatus(self):
statusbar = self.CreateStatusBar(2, wx.ST_SIZEGRIP)
statusbar.SetStatusWidths([-2, -3])
statusbar.SetStatusText("Ready", 0)
statusbar.SetStatusText("WxIPython "+str(__version__), 1)
return statusbar
def updateStatus(self,text):
states = {'IDLE':'Idle',
'DO_EXECUTE_LINE':'Send command',
'WAIT_END_OF_EXECUTION':'Running command',
'WAITING_USER_INPUT':'Waiting user input',
'SHOW_DOC':'Showing doc',
'SHOW_PROMPT':'Showing prompt'}
self.statusbar.SetStatusText(states[text], 0)
def OnClose(self, event):
"""#event used to close program """
# deinitialize the frame manager
self._mgr.UnInit()
self.Destroy()
event.Skip()
def OnExitDlg(self, event):
dlg = wx.MessageDialog(self, 'Are you sure you want to quit WxIPython',
'WxIPython exit',
wx.ICON_QUESTION |
wx.YES_NO | wx.NO_DEFAULT
)
if dlg.ShowModal() == wx.ID_YES:
dlg.Destroy()
self._mgr.UnInit()
self.Destroy()
dlg.Destroy()
#event to display IPython pannel
def OnShowIPythonPanel(self,event):
""" #event to display Boxpannel """
self._mgr.GetPane(self.ipython_panel).Show(True)
self._mgr.Update()
#event to display History pannel
def OnShowHistoryPanel(self,event):
self._mgr.GetPane(self.history_panel).Show(True)
self._mgr.Update()
def OnShowAllPanel(self,event):
"""#event to display all Pannels"""
self._mgr.GetPane(self.ipython_panel).Show(True)
self._mgr.GetPane(self.history_panel).Show(True)
self._mgr.Update()
def OnShowAbout(self, event):
# First we create and fill the info object
info = wx.AboutDialogInfo()
info.Name = "WxIPython"
info.Version = str(__version__)
info.Copyright = "(C) 2007 Laurent Dufrechou"
info.Description = wordwrap(
"A Gui that embbed a multithreaded IPython Shell",
350, wx.ClientDC(self))
info.WebSite = ("http://ipython.scipy.org/", "IPython home page")
info.Developers = [ "Laurent Dufrechou" ]
licenseText="BSD License.\nAll rights reserved. This program and the accompanying materials are made available under the terms of the BSD which accompanies this distribution, and is available at http://www.opensource.org/licenses/bsd-license.php"
info.License = wordwrap(licenseText, 500, wx.ClientDC(self))
# Then we call wx.AboutBox giving it that info object
wx.AboutBox(info)
#-----------------------------------------
#Creating our application
#-----------------------------------------
class MyApp(wx.PySimpleApp):
"""Creating our application"""
def __init__(self, sync_ok=False):
wx.PySimpleApp.__init__(self)
self.frame = MyFrame(sync_ok=sync_ok)
self.frame.Show()
#-----------------------------------------
#Main loop
#-----------------------------------------
def main():
app = MyApp(is_sync_frontend_ok)
app.SetTopWindow(app.frame)
app.MainLoop()
#if launched as main program run this
if __name__ == '__main__':
main()
|