def toString(self, structure): filename='<input>' symbol='single' localVars = {"self" : structure, "RETURN" : ""} inter = InteractiveInterpreter(localVars) #if isinstance(source, types.UnicodeType): # import IOBinding # try: # source = source.encode(IOBinding.encoding) # except UnicodeError: console = InteractiveConsole(localVars, filename) try: code_object = compile(self.data.encode('ascii','ignore'), '<string>', 'exec') exec code_object in localVars except Exception as e : print ("- ERR --Kind:%s---------------------------------------" % (self.template.kind) ) InteractiveInterpreter.showsyntaxerror(console, filename) frames = inspect.trace() lineNumber = frames[1][2] print ("At line %s" % lineNumber) print ("- /ERR -----------------------------------------") print ("- CODE -----------------------------------------") lines = self.data.split('\n') for i in range(0,lineNumber): print lines[i] print "^"*20 print ("- /CODE -----------------------------------------") print ("") return localVars["RETURN"]
def showsyntaxerror(self, filename=None): """Extend base class method: Add Colorizing Color the offending position instead of printing it and pointing at it with a caret. """ text = self.tkconsole.text stuff = self.unpackerror() if stuff: msg, lineno, offset, line = stuff if lineno == 1: pos = "iomark + %d chars" % (offset - 1) else: pos = "iomark linestart + %d lines + %d chars" % \ (lineno-1, offset-1) text.tag_add("ERROR", pos) text.see(pos) char = text.get(pos) if char and char in IDENTCHARS: text.tag_add("ERROR", pos + " wordstart", pos) self.tkconsole.resetoutput() self.write("SyntaxError: %s\n" % str(msg)) else: self.tkconsole.resetoutput() InteractiveInterpreter.showsyntaxerror(self, filename) self.tkconsole.showprompt()
def execute_or_eval(self, mode, locals): """ Run the code """ basic_interpreter = InteractiveInterpreter(locals=locals) with tempfile.TemporaryFile( mode='w+', prefix='interpreter_error') as error_output: original_error = sys.stderr sys.stderr = error_output try: if mode == 'exec': code = compile(self.source, self.filename, 'exec') else: code = compile(self.expr, '<string>', 'eval') except: InteractiveInterpreter.showsyntaxerror(self.filename) sys.stderr.seek(0) result = sys.stderr.read() self.report.add_compilation_error('error', err_type='SyntaxError', details=result) return False else: # No compilation errors here if mode == 'exec': result = basic_interpreter.runcode(code) sys.stderr.seek(0) result = sys.stderr.read() if result: self.report.add_compilation_error( 'error', err_type='SyntaxError', details=result) return False else: sys.stdout.seek(0) result = sys.stdout.read() self.report.set_result(result) return True else: # mode eval try: result = eval(code, locals, locals) except Exception as err: a, b, tb = sys.exc_info() # Get the traceback object # Extract the information for the traceback corresponding to the error # inside the source code : [0] refers to the result = exec(code) # traceback, [1] refers to the last error inside code filename, lineno, file_type, line = traceback.extract_tb( tb)[1] print(traceback.format_exception(a, b, tb)) tb_str = "".join(traceback.format_exception_only(a, b)) self.report.add_execution_error('error', a.__name__, details=str(err)) return False self.report.set_result(result) return True finally: sys.stderr = original_error
def showsyntaxerror(self, filename=None): """Extend base class method: Add Colorizing Color the offending position instead of printing it and pointing at it with a caret. """ text = self.tkconsole.text stuff = self.unpackerror() if stuff: msg, lineno, offset, line = stuff if lineno == 1: pos = "iomark + %d chars" % (offset - 1) else: pos = "iomark linestart + %d lines + %d chars" % (lineno - 1, offset - 1) text.tag_add("ERROR", pos) text.see(pos) char = text.get(pos) if char and char in IDENTCHARS: text.tag_add("ERROR", pos + " wordstart", pos) self.tkconsole.resetoutput() self.write("SyntaxError: %s\n" % str(msg)) else: self.tkconsole.resetoutput() InteractiveInterpreter.showsyntaxerror(self, filename) self.tkconsole.showprompt()
def showsyntaxerror(self, filename=None): self._outputBrush = QtGui.QBrush(QtGui.QColor('#ffcc63')) try: InteractiveInterpreter.showsyntaxerror(self, filename) finally: self._outputBrush = None
def toString(self, structure): filename = '<input>' symbol = 'single' localVars = {"self": structure, "RETURN": ""} inter = InteractiveInterpreter(localVars) #if isinstance(source, types.UnicodeType): # import IOBinding # try: # source = source.encode(IOBinding.encoding) # except UnicodeError: console = InteractiveConsole(localVars, filename) try: code_object = compile(self.data, '<string>', 'exec') exec code_object in localVars except Exception as e: print("- ERR --Kind:%s---------------------------------------" % (self.template.kind)) InteractiveInterpreter.showsyntaxerror(console, filename) frames = inspect.trace() lineNumber = frames[1][2] print "At line %s" % lineNumber print("- /ERR -----------------------------------------") print("- CODE -----------------------------------------") lines = self.data.split('\n') for i in range(0, lineNumber): print lines[i] print "^" * 20 print("- /CODE -----------------------------------------") print("") return localVars["RETURN"]
def showsyntaxerror(self, filename = None): self._outputBrush = QtGui.QBrush(QtGui.QColor('#ffcc63')) try: InteractiveInterpreter.showsyntaxerror(self, filename) finally: self._outputBrush = None
def execfile(self, filename, source=None): # Execute an existing file if source is None: source = open(filename, "r").read() try: code = compile(source, filename, "exec") except (OverflowError, SyntaxError): self.tkconsole.resetoutput() InteractiveInterpreter.showsyntaxerror(self, filename) else: self.runcode(code)
def execute_or_eval(self, mode, locals): """ Run the code """ basic_interpreter = InteractiveInterpreter(locals=locals) with tempfile.TemporaryFile(mode='w+', prefix='interpreter_error') as error_output: original_error = sys.stderr sys.stderr = error_output try: if mode == 'exec': code = compile(self.source, self.filename, 'exec') else: code = compile(self.expr, '<string>', 'eval') except: InteractiveInterpreter.showsyntaxerror(self.filename) sys.stderr.seek(0) result = sys.stderr.read() self.report.add_compilation_error('error', err_type='SyntaxError', details=result) return False else: # No compilation errors here if mode == 'exec': result = basic_interpreter.runcode(code) sys.stderr.seek(0) result = sys.stderr.read() if result: self.report.add_compilation_error('error', err_type='SyntaxError', details=result) return False else: sys.stdout.seek(0) result = sys.stdout.read() self.report.set_result(result) return True else: # mode eval try: result = eval(code, locals, locals) except Exception as err: a, b, tb = sys.exc_info() # Get the traceback object # Extract the information for the traceback corresponding to the error # inside the source code : [0] refers to the result = exec(code) # traceback, [1] refers to the last error inside code filename, lineno, file_type, line = traceback.extract_tb(tb)[1] print(traceback.format_exception(a, b, tb)) tb_str = "".join(traceback.format_exception_only(a, b)) self.report.add_execution_error('error', a.__name__, details=str(err)) return False self.report.set_result(result) return True finally: sys.stderr = original_error
def execfile(self, filename, source=None): "Execute an existing file" if source is None: source = open(filename, "r").read() try: code = compile(source, filename, "exec") except (OverflowError, SyntaxError): #self.tkconsole.resetoutput() tkerr = sys.stderr print>>tkerr, '*** Error in script or command!\n' print>>tkerr, 'Traceback (most recent call last):' InteractiveInterpreter.showsyntaxerror(self, filename) else: self.runcode(code)
def execfile(self, filename, source=None): "Execute an existing file" if source is None: with tokenize.open(filename) as fp: source = fp.read() try: code = compile(source, filename, "exec") except (OverflowError, SyntaxError): self.resetoutput() print('*** Error in script or command!\n' 'Traceback (most recent call last):') InteractiveInterpreter.showsyntaxerror(self, filename) else: self.runcode(code)
def execfile(self, filename, source=None): "Execute an existing file" if source is None: source = open(filename, "r").read() try: code = compile(source, filename, "exec") except (OverflowError, SyntaxError): self.tkconsole.resetoutput() tkerr = self.tkconsole.stderr print >> tkerr, '*** Error in script or command!\n' print >> tkerr, 'Traceback (most recent call last):' InteractiveInterpreter.showsyntaxerror(self, filename) self.tkconsole.showprompt() else: self.runcode(code)
def execfile(self, filename, source=None): "Execute an existing file" if source is None: with tokenize.open(filename) as fp: source = fp.read() try: code = compile(source, filename, "exec") except (OverflowError, SyntaxError): self.tkconsole.resetoutput() print('*** Error in script or command!\n' 'Traceback (most recent call last):', file=self.tkconsole.stderr) InteractiveInterpreter.showsyntaxerror(self, filename) self.tkconsole.showprompt() else: self.runcode(code)
def showsyntaxerror(self, filename=None): # Extend base class to color the offending position # (instead of printing it and pointing at it with a caret) text = self.tkconsole.text stuff = self.unpackerror() if not stuff: self.tkconsole.resetoutput() InteractiveInterpreter.showsyntaxerror(self, filename) return msg, lineno, offset, line = stuff if lineno == 1: pos = "iomark + %d chars" % (offset - 1) else: pos = "iomark linestart + %d lines + %d chars" % (lineno - 1, offset - 1) text.tag_add("ERROR", pos) text.see(pos) char = text.get(pos) if char and char in string.letters + string.digits + "_": text.tag_add("ERROR", pos + " wordstart", pos) self.tkconsole.resetoutput() self.write("SyntaxError: %s\n" % str(msg))
def showsyntaxerror(self, filename=None): # Extend base class to color the offending position # (instead of printing it and pointing at it with a caret) text = self.tkconsole.text stuff = self.unpackerror() if not stuff: self.tkconsole.resetoutput() InteractiveInterpreter.showsyntaxerror(self, filename) return msg, lineno, offset, line = stuff if lineno == 1: pos = "iomark + %d chars" % (offset-1) else: pos = "iomark linestart + %d lines + %d chars" % (lineno-1, offset-1) text.tag_add("ERROR", pos) text.see(pos) char = text.get(pos) if char and char in string.letters + string.digits + "_": text.tag_add("ERROR", pos + " wordstart", pos) self.tkconsole.resetoutput() self.write("SyntaxError: %s\n" % str(msg))
def showsyntaxerror(self, filename=None): self.set_write_mode('font_color_syntaxerror') InteractiveInterpreter.showsyntaxerror(self, filename=filename)
def showsyntaxerror(self, *args, **kwargs): self.is_syntax_error = True InteractiveInterpreter.showsyntaxerror(self, *args, **kwargs)
def showsyntaxerror(self, filename=None): self.write = self.writeTrace InteractiveInterpreter.showsyntaxerror(self, filename) self.write = self._write
def showsyntaxerror(self, filename): self.stdout.write('\n') with disabled_excepthook(): InteractiveInterpreter.showsyntaxerror(self, filename) self.done_signal.emit(False, None)
def showsyntaxerror(self, filename=None): """Extend base class method """ InteractiveInterpreter.showsyntaxerror(self, filename)
def showsyntaxerror(self, filename): InteractiveInterpreter.showsyntaxerror(self, filename) self.done_signal.emit(False, None)
#! /usr/bin/env python
class DevConsole(QtWidgets.QMainWindow, QtWidgets.QDialog, Ui_devConsole): ''' DevConsole self.qtTools = kmxQtCommonTools.CommonTools(self.win, self.iconPath) self.qtTools.applyStyle() dv = self.qtTools.getIconString('/04/16/39.png') self.qtConsole = DevConsolePlug.DevConsole(self.win, ShowPrint=True, ShowError=True, StatusBar=self.win.statusBar, AsDock=True, InitalizeScripts=True, logCount=30, btnIcon=dv, addObj=self) Arguments: ShowPrint... Captures all print outputs to DevConsole o/p ShowError... Captures all error info outputs to DevConsole o/p Methods: appendPlainOutput(txt) ... Append plain text into DevConsole o/p appendSplOutput(txt) ... Append TimeStamped text into DevConsole o/p ''' def __init__(self, parent=None, ShowPrint=True, ShowError=True, StatusBar=None, AsDock=False, logCount=30, ScriptsPath='Scripts/', InitalizeScripts=True, btnText="Console", btnIcon="F:/04/06/29.PNG", addObj=None): ''' Parent - Pass QWIDGET based objects. Else I will create my own. ShowPrint - Redirect standard prints ShowError - Redirect standard errors StatusBar - Attach DevC Invoke button to this status bar else You should invoke DevC explicitly AsDock - If True creates DevC as a dock else as a dialog window ''' last_update_date = 'July 02 2015' # July 02 2015 , Jan 12 2013 self.addObj = addObj self.parent = parent self.asDock = AsDock self.logCount = logCount super(DevConsole, self).__init__(self.parent) atexit.register(self.writeToLog) # Load File self.loadedFile = False self.loadedFileName = '' self.pyDesigner = 'C:\Python34\Lib\site-packages\PyQt5\designer.exe' #Flags self.qtTools = kmxQtCommonTools.CommonTools(self) self.ttls = kmxTools.Tools() self.qtTree = kmxQtTreeWidget.TreeWidget() self.qtMenu = kmxQtMenuBuilder.MenuBuilder() self.qtConn = kmxQtConnections.QtConnections(self) self.qtIcon = kmxQtCommonTools.iconSetup(self) self.standalone = 0 if self.parent else 1 if self.standalone: print('No parent specified! Creating standalone console!') self.parent = self.win = QtWidgets.QMainWindow() self.win.resize(689, 504) self.mainWidget = QtWidgets.QWidget(self.win) self.setupUi(self.mainWidget) self.win.setCentralWidget(self.mainWidget) self.toolbar = QtWidgets.QToolBar('Main Tools', self) self.toolbar2 = QtWidgets.QToolBar('Additional Tools', self) self.toolbar.setFloatable(True) self.toolbar2.setFloatable(True) self.win.addToolBar(self.toolbar) self.win.addToolBar(self.toolbar2) self.setStandAloneModeFeatures() self.btnExecute.setVisible(0) self.btnLoadScript.setVisible(0) self.btnSaveScript.setVisible(0) self.btnNewScript.setVisible(0) self.btnQuickSaveScript.setVisible(0) self.label.setVisible(1) self.label.setText('Output:') self.line.setVisible(0) #self.sciOutput.resize(self.sciOutput.width(), self.sciOutput.height() + 90) elif self.asDock: if hasattr(self.parent, 'addDockWidget'): print('Creating dock based console!') self.win = QtWidgets.QDockWidget(self.parent) base = QtWidgets.QWidget() self.setupUi(base) self.win.setWidget(base) self.parent.addDockWidget(QtCore.Qt.DockWidgetArea(2), self.win) # print ('Creating dock based console!') # self.dck = QtWidgets.QDockWidget(self.parent) # # dlg = QtWidgets.QWidget() # # self.win = QtWidgets.QMainWindow() # lyt = QtWidgets.QVBoxLayout() # lyt.addWidget(self.win) # wdgt = QtWidgets.QWidget(self.dck) # self.setupUi(wdgt) # self.win.setCentralWidget(wdgt) # # dlg.setLayout(lyt) # # self.dck.setWidget(dlg) # self.parent.addDockWidget(QtCore.Qt.DockWidgetArea(2), self.dck) else: print('Unsupported Parent for creating dock based console! ' + str(self.parent)) print('Connecting console to given parent as a dialog...' + str(self.parent)) self.win = QtWidgets.QDialog(self.parent) self.setupUi(self.win) else: print('Connecting console to given parent as a dialog...' + str(self.parent)) self.win = QtWidgets.QDialog(self.parent) self.setupUi(self.win) self.outputFont = self.sciOutput.font() self.outputFont.setFamily("Courier") self.outputFont.setPointSize(10) self.outputFont.setFixedPitch(True) self.sciOutput.setFont(self.outputFont) self.sciOutput.setMarginsFont(self.outputFont) print( "Outputs Redirected to HaPy. Check HaPy console log for furthur system messages." ) if ShowPrint: sys.stdout = self if ShowError: sys.stderr = self self.inter = InteractiveInterpreter() self.inter.locals['dev'] = self globals()['dev'] = self self.win.setWindowIcon(self.parent.windowIcon()) self.win.setWindowTitle('HaPy') self.PLX = Qsci.QsciLexerPython(self) self.ABS = Qsci.QsciAPIs(self.PLX) # self.PLX.setAPIs(self.ABS) self.ABS.prepare() self.sciOutput.setReadOnly(1) self._setQSci(self.sciOutput) # Connections self.tabWidget.tabCloseRequested.connect(self.tabClose) if not self.standalone: self.btnExecute.clicked.connect(self.btnRedirector) #self.btnExecute_2.clicked.connect(self.btnRedirector) self.btnLoadScript.clicked.connect(self.btnRedirector) self.btnSaveScript.clicked.connect(self.btnRedirector) self.btnNewScript.clicked.connect(self.btnRedirector) self.btnQuickSaveScript.clicked.connect(self.btnRedirector) self.qtTools.connectToRightClick(self.treeWidget, self.pluginRightClick) self.tabWidget.__class__.keyReleaseEvent = self.tabKeyPress if StatusBar: self.stsBtnDebugger = QtWidgets.QToolButton(self.parent) self.stsBtnDebugger.setText(btnText) self.stsBtnDebugger.setToolTip(btnText) self.stsBtnDebugger.setAutoRaise(1) self.stsBtnDebugger.setMaximumHeight(18) StatusBar.addPermanentWidget(self.stsBtnDebugger, 0) self.stsBtnDebugger.clicked.connect(self.btnRedirector) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(btnIcon), QtGui.QIcon.Normal, QtGui.QIcon.On) self.stsBtnDebugger.setIcon(icon) else: self.stsBtnDebugger = None self.win.hide() # Plugin Lister #self.treeWidget.headerItem().setText(0, "DevS") self.treeWidget.itemDoubleClicked.connect(self.pluginSelected) self.treeWidget.setVisible(False) print('---------------------------------------') print('HaPy - Handy Python') print('Interactive Interpreter') print('---------------------------------------') print('Initiated!') print('\nLog Start Time: ' + str(strftime("%Y/%m/%d %H:%M:%S"))) print('\n---------------------------------------\n') print('*** Python %s on %s.***' % (sys.version, sys.platform)) print(sys.copyright) print('') print('Platform: ' + sys.platform) print('Version: ' + str(sys.getwindowsversion())) print('FileSys encodeing: ' + str(sys.getfilesystemencoding())) drline = "\n---------------------------------------\n" self.credit = drline + 'About HaPy:\nHandy Python - Interactive Interpreter/Scripting Environment \nAn expreimental project by \nKumaresan Lakshmanan\nFor Quick, Portable windows automation. \nDate: ' + last_update_date + drline print(self.credit) self.InitalizeScripts = InitalizeScripts self.scriptsDirName = ScriptsPath self.scriptsPath = os.path.abspath(self.scriptsDirName) print("Checking scripts path..." + os.path.abspath(self.scriptsPath)) if self.scriptsPath: if self.InitalizeScripts and self.scriptsPath and not os.path.exists( self.scriptsPath): os.makedirs(self.scriptsPath) else: print('Invalid script path!') #Start loading the scripts... try: self.execPlugin() self.treeWidget.setVisible(True) except: print(errorReport()) try: if self.InitalizeScripts: self.execStartUp() else: self.addEmptyTab() except: print(errorReport()) if self.standalone: self.qtConn.uiMain = self.win self.qtConn.installEventHandler() self.qtConn.addEventConnection(self.win, 'WindowDeactivate', self.onWinDeAct) self.qtConn.addEventConnection(self.win, 'Close', self.onClose) self.qtConn.addEventConnection(self.win, 'Hide', self.onHide) self.qtConn.addEventConnection(self.win, 'Show', self.onShow) if (os.path.exists('layout.lyt')): customList = self.qtTools.uiLayoutRestore( 'layout.lyt', [self.splitter, self.splitter_2]) if (customList): self.win.resize(customList[0]) self.win.move(customList[1]) self.loadTabs() print("All set, You are ready to go...") def onWinDeAct(self, *arg): #self.win.hide() pass def _handleTrayItemClicked(self, itemName): pass def trayItemClicked(self, *arg): caller = self.sender() itm = caller.text() if (itm == 'Quit'): sys.exit(0) if (itm == 'About'): print(self.credit) if (itm == 'Help'): print('Not Implemented') def trayAgentReady(self): """ trayagent(forwho,trayclickedfunction) catch the trayobj i trhough... Dont forget to kill your object on Close Event use... xtools.traykiller() """ self.tray = QtWidgets.QSystemTrayIcon( self.qtIcon.getIcon('action_log.png'), self.win) self.tray.activated.connect(self.trayClicked) #self.connect(self.tray,SIGNAL("activated(QSystemTrayIcon::ActivationReason)"),self.trayClicked) self.tray.show() return self.tray def trayClicked(self, click): if (click == 3): if (self.win.isVisible()): self.win.hide() else: self.win.show() #if self.win.windowState() == QtCore.Qt.WindowMinimized: self.win.setWindowState(QtCore.Qt.WindowActive) self.win.activateWindow() self.win.raise_() def traymessage(self, messagetitle, message): self.tray.showMessage(messagetitle, message) def traykiller(self): self.tray.hide() del (self.tray) def onClose(self, *arg): print("Closing...") self.traykiller() customList = [self.win.size(), self.win.pos()] self.qtTools.uiLayoutSave('layout.lyt', [self.splitter, self.splitter_2], customList) self.saveTabs() self.writeToLog() def onHide(self, *arg): #print("Hide") #self.win.setWindowFlags(QtCore.Qt.ToolTip) pass def onShow(self, *arg): #print("Show") #self.win.setWindowFlags(QtCore.Qt.Window) pass def saveTabs(self): lst = [] for cnt in range(0, self.tabWidget.count()): wdgt = self.tabWidget.widget(cnt) #'userSetup.py' lst.append(wdgt.toolTip()) current = self.tabWidget.currentIndex() lst.append(current) self.qtTools.quickSave(lst, "tabs.tbs") def loadTabs(self): if (os.path.exists('tabs.tbs')): lst = self.qtTools.quickLoad("tabs.tbs") for cnt in range(0, len(lst) - 1): if 'New Script' in lst[cnt]: self.addEmptyTab() elif 'userSetup.py' in lst[cnt]: continue else: if (os.path.exists(lst[cnt])): self.addNewTab(lst[cnt]) index = lst[len(lst) - 1] self.tabWidget.setCurrentIndex(index) def getUpdatedLocals(self): try: raise None except: frame = sys.exc_info()[2].tb_frame.f_back # evaluate commands in current namespace namespace = frame.f_globals.copy() namespace.update(frame.f_locals) return namespace def addShortcut(self, label='text', icon='bullet_star.png', callBackFn=None): if (text == '|'): self.toolbar2.addSeparator() else: action = QtWidgets.QAction(self) action.setText(label) if callBackFn is not None: action.triggered.connect(callBackFn) self.qtIcon.setIcon(action, icon) self.toolbar2.addAction(action) def setStandAloneModeFeatures(self): """ Standalone Mode :return: """ # Ready Menu Bar self.menubar = self.qtMenu.createMenuBar(self.win) self.mnuFile = self.qtMenu.createMenu(self.menubar, "File") self.mnuEdit = self.qtMenu.createMenu(self.menubar, "Edit") self.mnuRun = self.qtMenu.createMenu(self.menubar, "Run") self.mnuAbout = self.qtMenu.createMenu(self.menubar, "About") self.mnuFileNewScript = self.qtMenu.createMenuItem( self.win, self.mnuFile, "New Script", self.btnRedirector) self.qtMenu.createMenuItemSeperator(self.mnuFile) self.mnuFileLoadScript = self.qtMenu.createMenuItem( self.win, self.mnuFile, "Load Script", self.btnRedirector) self.mnuFileQuickSaveScript = self.qtMenu.createMenuItem( self.win, self.mnuFile, "Save Script", self.btnRedirector) self.mnuFileSaveScript = self.qtMenu.createMenuItem( self.win, self.mnuFile, "Save Script As", self.btnRedirector) self.qtMenu.createMenuItemSeperator(self.mnuFile) self.mnuFileQuit = self.qtMenu.createMenuItem(self.win, self.mnuFile, "Quit", self.btnRedirector) self.mnuEditClearOutput = self.qtMenu.createMenuItem( self.win, self.mnuEdit, "Clear Outputs", self.btnRedirector) self.mnuEditClearInput = self.qtMenu.createMenuItem( self.win, self.mnuEdit, "Clear Inputs", self.btnRedirector) # self.mnuRunExecuteNoClear = self.qtMenu.createMenuItem(self.win, self.mnuRun, "Execute Script + No Clear", self.execute_Clicked_NoClear) # self.mnuRunExecuteNoClear.setShortcut("Ctrl+Enter") self.mnuRunExecute = self.qtMenu.createMenuItem( self.win, self.mnuRun, "Execute Script", self.doExecute) self.mnuRunExecute.setShortcut("Ctrl+Enter") self.mnuAboutHPSE = self.qtMenu.createMenuItem(self.win, self.mnuAbout, "About HaPy", self.btnRedirector) self.qtIcon.setIcon(self.mnuFileNewScript, 'page.png') self.qtIcon.setIcon(self.mnuFileLoadScript, 'page_edit.png') self.qtIcon.setIcon(self.mnuFileQuickSaveScript, 'page_save.png') self.qtIcon.setIcon(self.mnuFileSaveScript, 'page_green.png') self.qtIcon.setIcon(self.mnuEditClearOutput, 'align_bellow.png') self.qtIcon.setIcon(self.mnuEditClearInput, 'align_above.png') self.qtIcon.setIcon(self.mnuRunExecute, 'page_lightning.png') self.qtIcon.setIcon(self.mnuAboutHPSE, 'emotion_happy.png') self.toolbar.addAction(self.mnuFileNewScript) self.toolbar.addSeparator() self.toolbar.addAction(self.mnuFileLoadScript) self.toolbar.addAction(self.mnuFileQuickSaveScript) self.toolbar.addSeparator() self.toolbar.addAction(self.mnuEditClearOutput) #self.toolbar.addAction(self.mnuEditClearInput) self.toolbar.addSeparator() self.toolbar.addAction(self.mnuRunExecute) #self.toolbar.addWidget(self.mnuFileLoadScript) self.tray = self.trayAgentReady() #self.rightMenu = self.qtMenu.createMenuForList(self, 'DevConsoleMenu', ['|','Help','About','|','Quit'], self.trayItemClicked) self.rightMenu = self.qtMenu.createMenu(None, 'DevConsoleMenu') self.tray.setContextMenu(self.rightMenu) self.updateTrayMenu('Quit', self.trayItemClicked) self.updateTrayMenu('|') self.updateTrayMenu('About', self.trayItemClicked) self.updateTrayMenu('Help', self.trayItemClicked) #self.setWindowFlags(QtCore.Qt.Tool) ''' # Remove other buttons self.btnClearOutput.setVisible(0) self.toolButton.setVisible(0) self.line_5.setVisible(0) self.line_6.setVisible(0) self.line_7.setVisible(0) self.btnLoadScript.setVisible(0) self.btnSaveScript.setVisible(0) self.line.setVisible(0) self.btnClearInput.setVisible(0) self.btnExecute.setVisible(0) self.line_2.setVisible(0) self.line_3.setVisible(0) self.line_4.setVisible(0) self.sciOutput.resize(self.sciOutput.width(), self.sciOutput.height() + 90) self.label.setText("Output:") self.label_2.setText("Workspace:") self.label_3.setText("Quick Commands:") ''' def updateTrayMenu(self, itemName, fnToCall=None): self.qtMenu.updateMenu(self, self.rightMenu, itemName, fnToCall) def pluginRightClick(self, point): #menu = ['m1','m2',['m3','m31',['m32','m321','m322'],'m33'],'m4','m5',['m6','m61','m62'],'m7'] #self.qtTools.popUpMenuAdv(menu,self.treeWidget,point,self.pluginRightClickSelected,'addedArgument') item = self.treeWidget.itemAt(point) if (item): name = item.text(0) path = item.data(0, QtCore.Qt.UserRole) if (os.path.exists(path)): if (os.path.isfile(path)): #Edit - File (If UI File there, Edit them) uiFile = item.data(0, QtCore.Qt.UserRole).replace( '.py', '.ui') if (os.path.exists(uiFile)): self.qtTools.popUpMenu(self.treeWidget, point, ["Edit", "Edit UI", "Delete"], self.pluginRightClickSelected, ["myarg1", "myarg2"]) else: self.qtTools.popUpMenu(self.treeWidget, point, ["Edit", "Delete"], self.pluginRightClickSelected, ["myarg1", "myarg2"]) else: #Directories - Nodes or Other dir if (name == "nodes"): self.qtTools.popUpMenu(self.treeWidget, point, ["New Node"], self.pluginRightClickSelected, ["myarg1", "myarg2"]) else: self.qtTools.popUpMenu(self.treeWidget, point, [ "New Simple Plug", "New UI Plug", "New Folder", "Refresh" ], self.pluginRightClickSelected, ["myarg1", "myarg2"]) else: #Empty area - right clicked or unknown path. self.qtTools.popUpMenu(self.treeWidget, point, [ "New Simple Plug", "New UI Plug", "New Folder", "Refresh" ], self.pluginRightClickSelected, ["myarg1", "myarg2"]) else: self.qtTools.popUpMenu( self.treeWidget, point, ["New Simple Plug", "New UI Plug", "New Folder", "Refresh"], self.pluginRightClickSelected, ["myarg1", "myarg2"]) def pluginRightClickSelected(self, *arg): act = self.parent.sender() menuOption = act.text() item = self.treeWidget.itemAt(act.data()) itemSelected = item.text(0) if item else None path = item.data(0, QtCore.Qt.UserRole) if item else self.scriptsPath if (menuOption == "Refresh"): self.execPlugin() if (menuOption == "New Folder"): nFolderName = self.qtTools.showInputBox( "ScriptFolderName", "Enter the new folder name", "folderName") if (nFolderName): newPath = os.path.join(path, nFolderName) os.makedirs(newPath, exist_ok=True) self.execPlugin() if (menuOption == "New Node"): nFileName = self.qtTools.showInputBox("ScriptName", "Enter the new Node name", "newNode") if (nFileName): data = self.ttls.fileContent('templateNode.py') data = data.replace('Add', nFileName.capitalize()) f = os.path.join(path, nFileName + ".py") self.ttls.writeFileContent(f, data) self.execPlugin() self.addNewTab(f) if (menuOption == "New Simple Plug"): nFileName = self.qtTools.showInputBox("PlugName", "Enter the new Plug name", "newPlug") if (nFileName): data = self.ttls.fileContent('templatePlug.py') data = data.replace('myClass', nFileName) f = os.path.join(path, nFileName + ".py") self.ttls.writeFileContent(f, data) self.execPlugin() self.addNewTab(f) if (menuOption == "New UI Plug"): nFileName = self.qtTools.showInputBox( "PlugName", "Enter the new UI Plug name", "newUIPlug") if (nFileName): pyf = os.path.join(path, nFileName + ".py") uif = os.path.join(path, nFileName + ".ui") data = self.ttls.fileContent('templateUIPlug.py') data = data.replace('UI_myUIPlug.ui', uif) data = data.replace('myUIPlug', nFileName) self.ttls.writeFileContent(pyf, data) self.execPlugin() self.addNewTab(pyf) data = self.ttls.fileContent('templateUIPlug.ui') self.ttls.writeFileContent(uif, data) print("Created..." + pyf) print("Created..." + uif) if (menuOption == "Edit"): pyFile = (item.data(0, QtCore.Qt.UserRole)) self.addNewTab(pyFile) if (menuOption == "Edit UI"): uiFile = item.data(0, QtCore.Qt.UserRole).replace('.py', '.ui') args = '"' + self.pyDesigner + '"' + " " + '"' + uiFile + '"' print("Execute: (" + args + ")") subprocess.call(args) if (menuOption == "Delete"): pyFile = item.data(0, QtCore.Qt.UserRole) uiFile = pyFile.replace('.py', '.ui') try: if (os.path.exists(pyFile)): print("Deleting..." + pyFile) os.remove(pyFile) if (os.path.exists(uiFile)): print("Deleting..." + uiFile) os.remove(uiFile) self.execPlugin() except OSError: pass def pluginSelected(self, *eve): selectedItem = eve[0] itemInfo = self.qtTree.getItemLabel(selectedItem) name = itemInfo['Label'] path = itemInfo['Data'] if (os.path.isfile(path)): print("\nExecuting: " + path) content = self.ttls.fileContent(path) self.runScript(content) def showAttrs(self, obj): dlg = QtWidgets.QDialog(self.win) dlg.setWindowTitle(str(type(obj))) lt = QtWidgets.QListWidget(dlg) for each in inspect.getmembers(obj): itm = QtWidgets.QListWidgetItem() attrName = str(each[0]) fnSymbol = "" if (inspect.isfunction(each[1]) or inspect.ismethod(each[1])): args = inspect.getargspec(each[1])[0] fnSymbol = "(" + str(args) + ")" itm.setText(attrName + fnSymbol) lt.addItem(itm) dlg.setFixedHeight(190) dlg.setFixedWidth(255) dlg.show() def execPlugin(self, *arg): self.populatePlugins() def populatePlugins(self): self.treeWidget.clear() print("Loading Plugins... ") spath = os.getcwd() if ('\.' in spath): return None self.addToSysPath(spath) for eachItem in os.listdir(self.scriptsPath): currentDirName = eachItem currentDirPath = os.path.join(self.scriptsPath, currentDirName) if (not "__" in currentDirPath): if os.path.isdir(currentDirPath): rItem = self.qtTree.createItem(currentDirName, currentDirPath) self.qtTree.addNewRoot(self.treeWidget, rItem) self.populatePluginsCore(rItem, currentDirPath) else: self.loadPlugin(currentDirPath) print("Plugins Loaded!") def populatePluginsCore(self, parentItem, searchPath): if ('\.' in searchPath): return None self.addToSysPath(searchPath) for eachItem in os.listdir(searchPath): currentDirName = eachItem currentDirPath = os.path.join(searchPath, currentDirName) if (not "__" in currentDirPath): if os.path.isdir(currentDirPath): rItem = self.qtTree.createItem(currentDirName, currentDirPath) self.qtTree.addChild(rItem, parentItem) self.populatePluginsCore(rItem, currentDirPath) else: self.loadPlugin(currentDirPath, parentItem) def addToSysPath(self, path): path = os.path.abspath(path) if ('\.' in path): return None print("Adding path to system... " + path) code = r'''import sys,os path2Add="%s" if path2Add not in sys.path and os.path.exists(path2Add): sys.path.append(path2Add) ''' % (path).replace(os.path.sep, '/') self.runScript(code) def loadPlugin(self, plugFile, parentTreeItem=None): if ('\.' in plugFile): return None modName = os.path.basename(plugFile).replace( os.path.splitext(plugFile)[1], '') content = self.ttls.fileContent(plugFile) expecting = "For DevConsole" if (expecting in content): item = self.qtTree.createItem(modName, plugFile) if (parentTreeItem is None): plugTreeItem = self.qtTree.addNewRoot(self.treeWidget, item) else: plugTreeItem = self.qtTree.addChild(item, parentTreeItem) print("Adding Plug... " + plugFile) else: print("Skipped Plug! (Add tag 'For DevConsole') " + plugFile) plugTreeItem = None #self.runScript(content) return plugTreeItem def execStartUp(self, *arg): self.addToSysPath(self.scriptsPath) self.userSetup = os.path.join(self.scriptsPath, 'userSetup.py') self.userSetup = self.userSetup if os.path.exists( self.userSetup) else os.path.join(self.scriptsPath, 'userSetup.pyc') self.userSetup = self.userSetup if os.path.exists( self.userSetup) else '' self.runScriptFile(self.userSetup) self.loadScriptCore(self.userSetup) def runScriptFile(self, scriptFile): if scriptFile and os.path.exists(scriptFile): print('Executing... %s' % scriptFile) data = self.ttls.fileContent(scriptFile) self.runScript(data) else: print('Script file missing...' + scriptFile) def encrypt(self, text): code = int(sys.argv[1] if (len(sys.argv) > 1) else 4321) cipher = '' for each in text: c = (ord(each) + code) % 126 if c < 32: c += 31 cipher += chr(c) return cipher def decrypt(self, text): code = int(sys.argv[1] if (len(sys.argv) > 1) else 4321) plaintext = '' for each in text: p = (ord(each) - code) % 126 if p < 32: p += 95 plaintext += chr(p) return plaintext def tabKeyPress(self, event): modifiers = QtWidgets.QApplication.keyboardModifiers() if (modifiers == QtCore.Qt.ControlModifier and event.key() == QtCore.Qt.Key_S): self.quickSave() if (modifiers == QtCore.Qt.ControlModifier and event.key() == QtCore.Qt.Key_N): self.addEmptyTab() #print(modifiers == QtCore.Qt.ControlModifier and event.key()==16777221) def tabClose(self, tabIndex): cnt = self.tabWidget.count() if (cnt > 1): #proceed closing the tab self.tabWidget.removeTab(tabIndex) def addEmptyTab(self): newTab = QtWidgets.QWidget() self.tabWidget.addTab(newTab, 'New Script') newTab.setToolTip('New Script') self.tabWidget.setCurrentWidget(newTab) tabGrid = QtWidgets.QGridLayout(newTab) tabGrid.setContentsMargins(2, 2, 2, 2) newSciInput = QsciScintilla(newTab) newSciInput.setFrameShape(QtWidgets.QFrame.Box) tabGrid.addWidget(newSciInput, 0, 0, 1, 1) self._setQSci(newSciInput) newSciInput.setText('') newSciInput.setFocus() def addNewTab(self, scriptFile): print("Loading tab..." + scriptFile) fileName = os.path.basename(scriptFile) newTab = QtWidgets.QWidget() self.tabWidget.addTab(newTab, fileName) newTab.setToolTip(scriptFile) self.tabWidget.setCurrentWidget(newTab) tabGrid = QtWidgets.QGridLayout(newTab) tabGrid.setContentsMargins(2, 2, 2, 2) newSciInput = QsciScintilla(newTab) newSciInput.setFrameShape(QtWidgets.QFrame.Box) tabGrid.addWidget(newSciInput, 0, 0, 1, 1) self._setQSci(newSciInput) data = str(self.ttls.fileContent(scriptFile)) newSciInput.setText(data) def _setQSci(self, newSciInput): newSciInput.setEolMode(Qsci.QsciScintilla.EolUnix) newSciInput.setAutoCompletionSource(Qsci.QsciScintilla.AcsAll) newSciInput.setLexer(self.PLX) newSciInput.setAutoCompletionThreshold(1) newSciInput.setAutoIndent(True) newSciInput.setIndentationsUseTabs(False) newSciInput.setAutoCompletionFillupsEnabled(True) newSciInput.setBraceMatching(Qsci.QsciScintilla.StrictBraceMatch) newSciInput.setMarginLineNumbers(1, 1) newSciInput.setMarginWidth(1, 45) newSciInput.setUtf8(True) newSciInput.setEolVisibility(False) #newSciInput.setWrapMode(Qsci.QsciScintilla.WrapMode(Qsci.QsciScintillaBase.SC_WRAP_WORD)) #newSciInput.setWrapVisualFlags(Qsci.QsciScintilla.WrapVisualFlag(Qsci.QsciScintilla.WrapFlagByBorder), Qsci.QsciScintilla.WrapVisualFlag(Qsci.QsciScintilla.WrapFlagNone), 0) def quickSave(self): (qsci, scriptName) = self.getCurrentEditor() if (scriptName != 'New Script'): self.saveQSCItoFile(qsci, scriptName) #self.qtTools.showInfoBox('Quick Save', 'File Saved!') print("Quick Saved! - " + str(scriptName)) else: self.saveScriptAs() def saveScriptAs(self): scpt = self.scriptsPath scpt = scpt if os.path.exists(scpt) else 'C:' options = QFileDialog.Options() options |= QFileDialog.DontUseNativeDialog fileName = QFileDialog.getSaveFileName(self.win, 'Save python script file...', scpt, 'Python(*.py);;All Files (*)', options=options) if (fileName and fileName[0] != ''): fileName = fileName[0] self.saveScriptCore(fileName) #Close and Reload Tab cin = self.tabWidget.currentIndex() self.tabClose(cin) self.loadScriptCore(fileName) def saveScriptCore(self, fileName): (qsci, scriptName) = self.getCurrentEditor() self.saveQSCItoFile(qsci, fileName) def saveQSCItoFile(self, qsci, fileName): self.ttls.writeFileContent(fileName, qsci.text()) def loadScript(self): scpt = self.scriptsPath scpt = scpt if os.path.exists(scpt) else 'D:' options = QFileDialog.Options() options |= QFileDialog.DontUseNativeDialog fileName = QFileDialog.getOpenFileName(self.win, 'Open python script file...', scpt, 'Python(*.py);;All Files (*)', options=options) if fileName and fileName[0] != '' and os.path.exists(fileName[0]): fileName = fileName[0] self.loadScriptCore(fileName) def loadScriptCore(self, fileName): if (os.path.isfile(fileName) and os.path.exists(fileName)): self.addNewTab(fileName) def btnRedirector(self): actingButton = self.parent.sender() scpt = self.scriptsPath scpt = scpt if os.path.exists(scpt) else 'D:' #if actingButton == self.toolButton: # self.treeWidget.setVisible(self.toolButton.isChecked()) if actingButton == self.stsBtnDebugger: if self.win.isVisible(): self.win.hide() else: self.win.show() elif (actingButton == self.btnNewScript or (self.standalone and actingButton == self.mnuFileNewScript)): self.addEmptyTab() elif ( actingButton == self.btnQuickSaveScript or (self.standalone and actingButton == self.mnuFileQuickSaveScript)): self.quickSave() # elif (actingButton == self.btnClearOutput or (self.standalone and actingButton == self.mnuEditClearOutput)): # self.sciOutput.clear() # self.loadedFileName = '' # self.loadedFile = False # self.lblFileLoadInfo.setText('No File Loaded!') elif (actingButton == self.btnExecute): self.doExecute() elif (actingButton == self.btnLoadScript or (self.standalone and actingButton == self.mnuFileLoadScript)): self.loadScript() elif (actingButton == self.btnSaveScript or (self.standalone and actingButton == self.mnuFileSaveScript)): self.saveScriptAs() elif (self.standalone and actingButton == self.mnuAboutHPSE): print(self.credit) elif (actingButton == self.mnuEditClearOutput): self.sciOutput.clear() elif (actingButton == self.mnuEditClearInput): (qsci, scriptName) = self.getCurrentEditor() qsci.clear() elif (self.standalone and actingButton == self.mnuFileQuit): sys.exit(0) else: print('Unkown button' + str(actingButton)) def getCurrentEditor(self): cwidget = self.tabWidget.currentWidget() lst = cwidget.children() if (len(lst) > 1): qsci = lst[1] scriptName = cwidget.toolTip() return (qsci, scriptName) def mouseLock(self): self.win.grabMouse(QtCore.Qt.WaitCursor) self.win.grabKeyboard() QtWidgets.QApplication.processEvents() def mouseRelease(self): self.win.releaseMouse() self.win.releaseKeyboard() QtWidgets.QApplication.processEvents() def doExecute(self): self.mouseLock() (qsci, scriptName) = self.getCurrentEditor() if (scriptName != ""): print("Executing..." + scriptName) if not str(qsci.text()) == '': inputs = str(qsci.text()).rstrip() self.appendPlainOutput(inputs) self.appendLineOutput() self.ABS.add(inputs) self.ABS.prepare() self.runScript(inputs) self.mouseRelease() """ ''' def runScript(self, script): try: command = str(script).replace('\r\n', '\n') try: #self.inter.compile(commands) res = eval(command, globals(), self.inter.locals) #res = exec(command, globals(), self.inter.locals) #print('Done1') except SyntaxError: # self.inter.showtraceback() # exec (command, globals(), locals()) res = self.inter.runcode(command) #print('Done2') QtWidgets.QApplication.processEvents() if res is not None: print(repr(res)) except SystemExit: self.inter.showsyntaxerror() crashHandle() sys.exit(0) except: print (errorReport()) ''' """ def runScript(self, script): try: command = str(script).replace('\r\n', '\n') locals = self.getUpdatedLocals() self.inter.locals.update(locals) try: res = self.inter.runcode(command) except SyntaxError: self.inter.showsyntaxerror() QtWidgets.QApplication.processEvents() if res is not None: print('\n---------------------------------------\n') print(repr(res)) print('\n---------------------------------------\n') except SystemExit: self.inter.showsyntaxerror() crashHandle() sys.exit(0) except: print(errorReport()) def appendPlainOutput(self, txt): self.appendTextCore(txt) def appendLineOutput(self): self.appendTextCore('\n') def appendSplOutput(self, txt): nowtime = strftime("%Y-%m-%d %H:%M:%S") splOutput = str(nowtime) + ' : ' + str(txt) self.appendPlainOutput(splOutput) def appendLog(self, txt): self.appendLineOutput() self.appendTextCore(txt) def appendTextCore(self, txt): self.sciOutput.setCursorPosition(self.sciOutput.lines(), 0) self.sciOutput.insert(str(txt)) vsb = self.sciOutput.verticalScrollBar() vsb.setValue(vsb.maximum()) hsb = self.sciOutput.horizontalScrollBar() hsb.setValue(0) # Standard Error and Print Capture def write(self, txt): self.appendPlainOutput(txt) def showEditor(self, exec_=0): if exec_: self.win.exec_() else: self.win.show() def writeToLog(self): """ Write info :return: """ curdir = os.getcwd() logdir = curdir + '/ConsoleLog' if not os.path.exists(logdir): os.makedirs(logdir) fileList = os.listdir(logdir) if len(fileList) >= self.logCount: fileToDelete = fileList[0] delFile = logdir + '/' + fileToDelete os.remove(delFile) print('\nLog End Time: ' + str(strftime("%Y/%m/%d %H:%M:%S"))) fileName = 'DC' + strftime("%Y%m%d%H%M%S") + '.log' logFileName = logdir + '/' + fileName self.saveQSCItoFile(self.sciOutput, logFileName)