class Interpreter(QWidget): lastCommands = [] lastIndex = 0 def __init__(self, context): QWidget.__init__(self) self.context = context self.setupUI() self.setWindowTitle('Interpreter') self.setMinimumSize(400, 250) def setupUI(self): layout = QVBoxLayout() layout.setContentsMargins(0, 0, 0, 0) self.out = QTextEdit() self.out.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.out.setTextInteractionFlags(Qt.TextSelectableByMouse | Qt.TextSelectableByKeyboard) self.highlighter = PythonSyntaxHighlighter( self.out, prefix = ">>>" ) self.input = QLineEdit() self.input.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum ) layout.addWidget(self.out, 1) layout.addWidget(self.input, 0) self.setLayout(layout) QWidget.connect(self.input, SIGNAL('returnPressed()'), self.run) def run(self): scode = str(self.input.text()).strip() self.out.append(">>> " + scode + "\n") self.input.setText('') name = threading.current_thread().name try: sys.stdout.flush(name) if len(self.lastCommands) == 100: del self.lastCommands[0] self.lastCommands.append(scode) self.lastIndex = 0 try: out = eval(scode, self.context) if out: print out except: code = compile(scode, '', 'exec') exec code in self.context except: traceback.print_exc() finally: self.write( sys.stdout.getOutput(name) ) def keyPressEvent(self, event): # Prev in command history if event.key() == Qt.Key_Up: try: self.lastIndex -= 1 self.input.setText(self.lastCommands[self.lastIndex]) except: self.lastIndex += 1 # Next in command history elif event.key() == Qt.Key_Down: try: self.lastIndex += 1 if self.lastIndex >= 0: self.lastIndex = 0 self.input.setText('') else: self.input.setText(self.lastCommands[self.lastIndex]) except: self.lastIndex -= 1 # Clear screen elif event.key() == Qt.Key_L: if event.modifiers() == Qt.ControlModifier: lines = self.out.height() / self.out.fontMetrics().height() #for i in xrange(lines): # self.out.append('') self.write('\n' * lines) self.out.moveCursor( QTextCursor.End ) #def getOutStream(self): # return self.TextOutput(self.out) def write(self, data): self.out.moveCursor( QTextCursor.End ) try: self.out.insertPlainText( unicode(data) ) except: self.out.insertPlainText( data ) self.out.moveCursor( QTextCursor.End )