1 # CONFIGURATION MANAGEMENT OF EDF VERSION
2 # ======================================================================
3 # COPYRIGHT (C) 1991 - 2002 EDF R&D WWW.CODE-ASTER.ORG
4 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
5 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
6 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
7 # (AT YOUR OPTION) ANY LATER VERSION.
9 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
10 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
11 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
12 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.
14 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
15 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
16 # 1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
19 # ======================================================================
21 import Tkinter,ScrolledText
22 import os, sys, string, traceback
28 class PythonInterpreter( code.InteractiveConsole):
29 def __init__( self, text, namespace = None):
30 code.InteractiveConsole.__init__( self, namespace)
33 def showtraceback( self):
34 start = self.text.pos + " - 1 lines"
35 code.InteractiveConsole.showtraceback( self)
37 self.text.tag_add( "exception", start, end)
39 class InterpWindow(Tkinter.Toplevel):
40 def __init__(self,namespace, parent=None):
41 Tkinter.Toplevel.__init__(self,parent)
43 self.stdout = self.stderr = self
48 self.shell = PythonInterpreter( self,namespace)
49 self.write("Python %s on %s\n%s\n(%s)\n" %
50 (sys.version, sys.platform, sys.copyright,
51 self.__class__.__name__))
55 def _initTkWidgets( self):
56 self.text = ScrolledText.ScrolledText( self, bg = "white",fg="black", wrap="word")
57 self.text.pack( fill='both', expand = 1)
58 self.text.bind( '<KeyPress>', self.clearMsg)
59 self.text.bind( '<Return>', self.inputhandler)
60 self.text.bind( '<Up>', self.uphistory)
61 self.text.bind( '<Down>', self.downhistory)
62 self.text.bind( '<Control-a>', self.goto_sol)
63 self.text.bind( '<Control-d>', self.sendeof)
64 self.text.tag_config("exception", foreground = "red")
66 def swapStdFiles(self):
67 sys.stdout,self.stdout = self.stdout,sys.stdout
68 sys.stderr,self.stderr = self.stderr,sys.stderr
70 def write(self, data):
71 self.text.insert("end", data)
72 self.pos = self.text.index("end - 1 char")
73 self.text.yview_pickplace("end")
75 def tag_add( self, tag, start, end):
76 self.text.tag_add( tag, start, end)
78 def inputhandler(self, *args):
79 # Remove any extraneous stuff
80 self.text.delete( self.pos + " lineend", "end")
82 line = self.text.get(self.pos, "end - 1 char")
83 self.text.insert("end", "\n")
84 self.pos = self.text.index("end")
85 self.addHistory( line)
87 if self.shell.push( line):
92 self.text.mark_set("insert", "end")
95 def addHistory( self, line):
97 self.history.insert( len( self.history) - 1, line)
98 self.hpos = len( self.history) - 1
100 def sendeof(self, *args):
104 def uphistory(self, event=None):
105 if not self.history: return "break"
108 self.hpos = self.hpos - 1
110 line = self.history[ self.hpos]
111 self.text.delete( self.pos, "end")
112 self.text.insert( self.pos, line)
116 def downhistory( self, event=None):
117 if not self.history: return "break"
119 if self.hpos < (len( self.history) - 1):
120 self.hpos = self.hpos + 1
122 line = self.history[ self.hpos]
123 self.text.delete( self.pos, "end")
124 self.text.insert( self.pos, line)
128 def goto_sol( self, event=None):
130 Met en mode edition la ligne courante
132 self.text.mark_set( 'insert', 'insert linestart + 4 chars')
135 def clearMsg( self, event=None):
136 index = self.text.index( "insert")
137 self.text.delete( "insert lineend", "end")
140 if __name__ == "__main__":
145 InterpWindow(d,parent=app)
147 Tkinter.Button(app,text="Interp",command=go).pack()
148 Tkinter.Button(app,text="Quit",command=app.destroy).pack()