Salome HOME
PN bug notation scientifique
[tools/eficas.git] / Editeur / Interp.py
1 # -*- coding: utf-8 -*-
2 #            CONFIGURATION MANAGEMENT OF EDF VERSION
3 # ======================================================================
4 # COPYRIGHT (C) 1991 - 2002  EDF R&D                  WWW.CODE-ASTER.ORG
5 # THIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
6 # IT UNDER THE TERMS OF THE GNU GENERAL PUBLIC LICENSE AS PUBLISHED BY
7 # THE FREE SOFTWARE FOUNDATION; EITHER VERSION 2 OF THE LICENSE, OR
8 # (AT YOUR OPTION) ANY LATER VERSION.
9 #
10 # THIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
11 # WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
12 # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
13 # GENERAL PUBLIC LICENSE FOR MORE DETAILS.
14 #
15 # YOU SHOULD HAVE RECEIVED A COPY OF THE GNU GENERAL PUBLIC LICENSE
16 # ALONG WITH THIS PROGRAM; IF NOT, WRITE TO EDF R&D CODE_ASTER,
17 #    1 AVENUE DU GENERAL DE GAULLE, 92141 CLAMART CEDEX, FRANCE.
18 #
19 #
20 # ======================================================================
21
22 import Tkinter,ScrolledText
23 import os, sys, string, traceback 
24 import code
25
26 sys.ps1 = ">>> "
27 sys.ps2 = "... "
28
29 class PythonInterpreter( code.InteractiveConsole):
30     def __init__( self, text, namespace = None):
31         code.InteractiveConsole.__init__( self, namespace)
32         self.text = text
33
34     def showtraceback( self):
35         start = self.text.pos + " - 1 lines"
36         code.InteractiveConsole.showtraceback( self)
37         end = self.text.pos
38         self.text.tag_add( "exception", start, end)
39
40 class InterpWindow(Tkinter.Toplevel):
41     def __init__(self,namespace, parent=None):
42         Tkinter.Toplevel.__init__(self,parent)
43         self._initTkWidgets()
44         self.stdout = self.stderr = self
45         self.pos = '1.0'
46         self.history = [ '' ]
47         self.hpos = 0
48         self.tabCount = 0
49         self.shell = PythonInterpreter( self,namespace)
50         self.write("Python %s on %s\n%s\n(%s)\n" %
51                        (sys.version, sys.platform, sys.copyright,
52                         self.__class__.__name__))
53         self.write( sys.ps1)
54         self.text.focus_set()
55
56     def _initTkWidgets( self):
57         self.text = ScrolledText.ScrolledText( self, bg = "white",fg="black", wrap="word")
58         self.text.pack( fill='both', expand = 1)
59         self.text.bind( '<KeyPress>', self.clearMsg)
60         self.text.bind( '<Return>', self.inputhandler)
61         self.text.bind( '<Up>', self.uphistory)
62         self.text.bind( '<Down>', self.downhistory)
63         self.text.bind( '<Control-a>', self.goto_sol)
64         self.text.bind( '<Control-d>', self.sendeof)
65         self.text.tag_config("exception", foreground = "red")
66
67     def swapStdFiles(self):
68         sys.stdout,self.stdout = self.stdout,sys.stdout
69         sys.stderr,self.stderr = self.stderr,sys.stderr
70
71     def write(self, data):
72         self.text.insert("end", data)
73         self.pos = self.text.index("end - 1 char")
74         self.text.yview_pickplace("end")
75
76     def tag_add( self, tag, start, end):
77         self.text.tag_add( tag, start, end)
78
79     def inputhandler(self, *args):
80         # Remove any extraneous stuff
81         self.text.delete( self.pos + " lineend", "end")
82         # Now get the line
83         line = self.text.get(self.pos, "end - 1 char")
84         self.text.insert("end", "\n")
85         self.pos = self.text.index("end")
86         self.addHistory( line)
87         self.swapStdFiles()
88         if self.shell.push( line):
89             self.write(sys.ps2)
90         else:
91             self.write(sys.ps1)
92         self.swapStdFiles()
93         self.text.mark_set("insert", "end")
94         return "break"
95
96     def addHistory( self, line):
97         if line:
98             self.history.insert( len( self.history) - 1, line)
99             self.hpos = len( self.history) - 1
100
101     def sendeof(self, *args):
102         self.destroy()
103         return "break"
104
105     def uphistory(self, event=None):
106         if not self.history: return "break"
107
108         if self.hpos > 0:
109             self.hpos = self.hpos - 1
110
111         line = self.history[ self.hpos]
112         self.text.delete( self.pos, "end")
113         self.text.insert( self.pos, line)
114
115         return "break"
116
117     def downhistory( self, event=None):
118         if not self.history: return "break"
119
120         if self.hpos < (len( self.history) - 1):
121             self.hpos = self.hpos + 1
122
123         line = self.history[ self.hpos]
124         self.text.delete( self.pos, "end")
125         self.text.insert( self.pos, line)
126
127         return "break"
128
129     def goto_sol( self, event=None):
130         """
131         Met en mode edition la ligne courante
132         """
133         self.text.mark_set( 'insert', 'insert linestart + 4 chars')
134         return "break"
135         
136     def clearMsg( self, event=None):
137         index = self.text.index( "insert")
138         self.text.delete( "insert lineend", "end")
139         self.tabCount = 0
140
141 if __name__ == "__main__":
142     app = Tkinter.Tk()
143     d={'a':1}
144
145     def go():
146       InterpWindow(d,parent=app)
147
148     Tkinter.Button(app,text="Interp",command=go).pack()
149     Tkinter.Button(app,text="Quit",command=app.destroy).pack()
150
151     app.mainloop()
152