Example #1
0
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 )