Skip to content

Commit 885d0ec

Browse files
committedMar 21, 2016
python console: switch to pyqt wrappers and new style signals, flake8 fixes, show exceptions in console also with pyqt5
1 parent 2526d3e commit 885d0ec

File tree

7 files changed

+61
-57
lines changed

7 files changed

+61
-57
lines changed
 

‎python/console/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,4 @@
2323
# This will get replaced with a git SHA1 when you do a git archive
2424
__revision__ = '$Format:%H$'
2525

26-
from console import show_console
26+
from .console import show_console # NOQA

‎python/console/console.py

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,15 @@
2020
"""
2121
import os
2222

23-
from PyQt4.QtCore import Qt, QTimer, QSettings, QCoreApplication, QSize, QByteArray, QFileInfo, SIGNAL, QUrl, QDir
24-
from PyQt4.QtGui import QDockWidget, QToolBar, QToolButton, QWidget,\
25-
QSplitter, QTreeWidget, QAction, QFileDialog, QCheckBox, QSizePolicy, QMenu, QGridLayout, QApplication, \
26-
QDesktopServices
27-
from PyQt4.QtGui import QVBoxLayout
23+
from PyQt.QtCore import Qt, QTimer, QSettings, QCoreApplication, QSize, QByteArray, QFileInfo, QUrl, QDir
24+
from PyQt.QtWidgets import QDockWidget, QToolBar, QToolButton, QWidget, QSplitter, QTreeWidget, QAction, QFileDialog, QCheckBox, QSizePolicy, QMenu, QGridLayout, QApplication
25+
from PyQt.QtGui import QDesktopServices
26+
from PyQt.QtWidgets import QVBoxLayout
2827
from qgis.utils import iface
29-
from console_sci import ShellScintilla
30-
from console_output import ShellOutputScintilla
31-
from console_editor import EditorTabWidget
32-
from console_settings import optionsDialog
28+
from .console_sci import ShellScintilla
29+
from .console_output import ShellOutputScintilla
30+
from .console_editor import EditorTabWidget
31+
from .console_settings import optionsDialog
3332
from qgis.core import QgsApplication, QgsContextHelp
3433
from qgis.gui import QgsFilterLineEdit
3534

@@ -44,7 +43,7 @@ def show_console():
4443
if _console is None:
4544
parent = iface.mainWindow() if iface else None
4645
_console = PythonConsole(parent)
47-
_console.show() # force show even if it was restored as hidden
46+
_console.show() # force show even if it was restored as hidden
4847
# set focus to the console so the user can start typing
4948
# defer the set focus event so it works also whether the console not visible yet
5049
QTimer.singleShot(0, _console.activate)
@@ -59,7 +58,6 @@ def show_console():
5958
QgsContextHelp.run("PythonConsole")
6059
settings.setValue('pythonConsole/contextHelpOnFirstLaunch', False)
6160

62-
_old_stdout = sys.stdout
6361
_console_output = None
6462

6563
# hook for python console so all output will be redirected
@@ -539,8 +537,7 @@ def __init__(self, parent=None):
539537
self.saveFileButton.triggered.connect(self.saveScriptFile)
540538
self.saveAsFileButton.triggered.connect(self.saveAsScriptFile)
541539
self.helpButton.triggered.connect(self.openHelp)
542-
self.connect(self.listClassMethod, SIGNAL('itemClicked(QTreeWidgetItem*, int)'),
543-
self.onClickGoToLine)
540+
self.listClassMethod.itemClicked.connect(self.onClickGoToLine)
544541
self.lineEditFind.returnPressed.connect(self._findText)
545542
self.findNextButton.clicked.connect(self._findNext)
546543
self.findPrevButton.clicked.connect(self._findPrev)

‎python/console/console_compile_apis.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@
2121

2222
import os
2323

24-
from PyQt4.Qsci import QsciAPIs
25-
from PyQt4.QtGui import QDialog, QDialogButtonBox
26-
from PyQt4.QtCore import QCoreApplication
24+
from PyQt.Qsci import QsciAPIs
25+
from PyQt.QtWidgets import QDialog, QDialogButtonBox
26+
from PyQt.QtCore import QCoreApplication
2727

28-
from ui_console_compile_apis import Ui_APIsDialogPythonConsole
28+
from .ui_console_compile_apis import Ui_APIsDialogPythonConsole
2929

3030

3131
class PrepareAPIDialog(QDialog):

‎python/console/console_editor.py

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,10 @@
1919
Some portions of code were taken from https://code.google.com/p/pydee/
2020
"""
2121

22-
from PyQt4.QtCore import Qt, QObject, QEvent, QSettings, QCoreApplication, QFileInfo, QSize, SIGNAL
23-
from PyQt4.QtGui import QFont, QFontMetrics, QColor, QShortcut, QKeySequence, QMenu, QApplication, QCursor, QWidget, QGridLayout, QSpacerItem, QSizePolicy, QFileDialog, QTabWidget, QTreeWidgetItem, QFrame, QLabel, QToolButton, QMessageBox
24-
from PyQt4.Qsci import (QsciScintilla,
25-
QsciLexerPython,
26-
QsciAPIs,
27-
QsciStyle)
22+
from PyQt.QtCore import Qt, QObject, QEvent, QSettings, QCoreApplication, QFileInfo, QSize
23+
from PyQt.QtGui import QFont, QFontMetrics, QColor, QKeySequence, QCursor
24+
from PyQt.QtWidgets import QShortcut, QMenu, QApplication, QWidget, QGridLayout, QSpacerItem, QSizePolicy, QFileDialog, QTabWidget, QTreeWidgetItem, QFrame, QLabel, QToolButton, QMessageBox
25+
from PyQt.Qsci import QsciScintilla, QsciLexerPython, QsciAPIs, QsciStyle
2826
from qgis.core import QgsApplication
2927
from qgis.gui import QgsMessageBar
3028
import sys
@@ -303,7 +301,7 @@ def contextMenuEvent(self, e):
303301
menu.addAction(
304302
QCoreApplication.translate("PythonConsole", "Hide Editor"),
305303
self.hideEditor)
306-
menu.addSeparator() # ------------------------------
304+
menu.addSeparator() # ------------------------------
307305
syntaxCheck = menu.addAction(iconSyntaxCk,
308306
QCoreApplication.translate("PythonConsole", "Check Syntax"),
309307
self.syntaxCheck, 'Ctrl+4')
@@ -561,8 +559,6 @@ def runScriptCode(self):
561559
filename = tabWidget.path
562560
msgEditorBlank = QCoreApplication.translate('PythonConsole',
563561
'Hey, type something to run!')
564-
msgEditorUnsaved = QCoreApplication.translate('PythonConsole',
565-
'You have to save the file before running it.')
566562
if filename is None:
567563
if not self.isModified():
568564
self.parent.pc.callWidgetMessageBarEditor(msgEditorBlank, 0, True)
@@ -895,8 +891,8 @@ def __init__(self, parent):
895891
self.layoutTopFrame2.addWidget(self.clButton, 0, 2, 1, 1)
896892

897893
self.topFrame.hide()
898-
self.connect(self.restoreTabsButton, SIGNAL('clicked()'), self.restoreTabs)
899-
self.connect(self.clButton, SIGNAL('clicked()'), self.closeRestore)
894+
self.restoreTabsButton.clicked.connect(self.restoreTabs)
895+
self.clButton.clicked.connect(self.closeRestore)
900896

901897
## Fixes #7653
902898
if sys.platform != 'darwin':
@@ -908,10 +904,8 @@ def __init__(self, parent):
908904

909905
# Menu button list tabs
910906
self.fileTabMenu = QMenu()
911-
self.connect(self.fileTabMenu, SIGNAL("aboutToShow()"),
912-
self.showFileTabMenu)
913-
self.connect(self.fileTabMenu, SIGNAL("triggered(QAction*)"),
914-
self.showFileTabMenuTriggered)
907+
self.fileTabMenu.aboutToShow.connect(self.showFileTabMenu)
908+
self.fileTabMenu.triggered.connect(self.showFileTabMenuTriggered)
915909
self.fileTabButton = QToolButton()
916910
txtToolTipMenuFile = QCoreApplication.translate("PythonConsole",
917911
"List all tabs")
@@ -922,8 +916,8 @@ def __init__(self, parent):
922916
self.fileTabButton.setPopupMode(QToolButton.InstantPopup)
923917
self.fileTabButton.setMenu(self.fileTabMenu)
924918
self.setCornerWidget(self.fileTabButton, Qt.TopRightCorner)
925-
self.connect(self, SIGNAL("tabCloseRequested(int)"), self._removeTab)
926-
self.connect(self, SIGNAL('currentChanged(int)'), self._currentWidgetChanged)
919+
self.tabCloseRequested.connect(self._removeTab)
920+
self.currentChanged.connect(self._currentWidgetChanged)
927921

928922
# New Editor button
929923
self.newTabButton = QToolButton()
@@ -934,7 +928,7 @@ def __init__(self, parent):
934928
self.newTabButton.setIcon(QgsApplication.getThemeIcon("console/iconNewTabEditorConsole.png"))
935929
self.newTabButton.setIconSize(QSize(24, 24))
936930
self.setCornerWidget(self.newTabButton, Qt.TopLeftCorner)
937-
self.connect(self.newTabButton, SIGNAL('clicked()'), self.newTabEditor)
931+
self.newTabButton.clicked.connect(self.newTabEditor)
938932

939933
def _currentWidgetChanged(self, tab):
940934
if self.settings.value("pythonConsole/enableObjectInsp",

‎python/console/console_output.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,10 @@
1919
Some portions of code were taken from https://code.google.com/p/pydee/
2020
"""
2121

22-
from PyQt4.QtCore import Qt, QCoreApplication, QSettings, SIGNAL
23-
from PyQt4.QtGui import QColor, QGridLayout, QSpacerItem, QSizePolicy, QFont, QShortcut, QKeySequence, QMenu, QApplication
24-
from PyQt4.Qsci import QsciScintilla, QsciLexerPython
22+
from PyQt.QtCore import Qt, QCoreApplication, QSettings
23+
from PyQt.QtGui import QColor, QFont, QKeySequence
24+
from PyQt.QtWidgets import QGridLayout, QSpacerItem, QSizePolicy, QShortcut, QMenu, QApplication
25+
from PyQt.Qsci import QsciScintilla, QsciLexerPython
2526
from qgis.core import QgsApplication
2627
from qgis.gui import QgsMessageBar
2728
import sys
@@ -265,10 +266,10 @@ def copy(self):
265266
"""Copy text to clipboard... or keyboard interrupt"""
266267
if self.hasSelectedText():
267268
text = unicode(self.selectedText())
268-
text = text.replace('>>> ', '').replace('... ', '').strip() # removing prompts
269+
text = text.replace('>>> ', '').replace('... ', '').strip() # removing prompts
269270
QApplication.clipboard().setText(text)
270271
else:
271-
self.emit(SIGNAL("keyboard_interrupt()"))
272+
raise KeyboardInterrupt
272273

273274
def enteredSelected(self):
274275
cmd = self.selectedText()

‎python/console/console_sci.py

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,20 @@
1919
Some portions of code were taken from https://code.google.com/p/pydee/
2020
"""
2121

22-
from PyQt4.QtCore import Qt, QSettings, QByteArray, QCoreApplication, QFile, QSize
23-
from PyQt4.QtGui import QDialog, QMenu, QColor, QShortcut, QKeySequence, QFont, QFontMetrics, QStandardItemModel, QStandardItem, QApplication, QClipboard
24-
from PyQt4.Qsci import QsciScintilla, QsciLexerPython, QsciAPIs
22+
from PyQt.QtCore import Qt, QSettings, QByteArray, QCoreApplication, QFile, QSize
23+
from PyQt.QtWidgets import QDialog, QMenu, QShortcut, QApplication
24+
from PyQt.QtGui import QColor, QKeySequence, QFont, QFontMetrics, QStandardItemModel, QStandardItem, QClipboard
25+
from PyQt.Qsci import QsciScintilla, QsciLexerPython, QsciAPIs
2526

2627
import sys
2728
import os
2829
import code
2930
import codecs
3031
import re
32+
import traceback
3133

3234
from qgis.core import QgsApplication
33-
from ui_console_history_dlg import Ui_HistoryDialogPythonConsole
35+
from .ui_console_history_dlg import Ui_HistoryDialogPythonConsole
3436

3537
_init_commands = ["from qgis.core import *", "import qgis.utils",
3638
"from qgis.utils import iface"]
@@ -544,7 +546,7 @@ def dropEvent(self, e):
544546
e.setDropAction(Qt.CopyAction)
545547
e.accept()
546548
else:
547-
QsciScintillaCompat.dropEvent(self, e) # FIXME
549+
QsciScintilla.dropEvent(self, e)
548550

549551
def insertFromDropPaste(self, textDP):
550552
pasteList = unicode(textDP).splitlines()
@@ -596,7 +598,7 @@ def runCommand(self, cmd):
596598
else:
597599
self.buffer.append(cmd)
598600
src = u"\n".join(self.buffer)
599-
more = self.runsource(src, "<input>")
601+
more = self.runsource(src)
600602
if not more:
601603
self.buffer = []
602604
## prevents to commands with more lines to break the console
@@ -614,6 +616,18 @@ def writeCMD(self, txt):
614616
prompt = getCmdString[0:4]
615617
sys.stdout.write(prompt + txt + '\n')
616618

619+
def runsource(self, source, filename='<input>', symbol='single'):
620+
hook = sys.excepthook
621+
try:
622+
def excepthook(etype, value, tb):
623+
self.write(u"".join(traceback.format_exception(etype, value, tb)))
624+
625+
sys.excepthook = excepthook
626+
627+
super(ShellScintilla, self).runsource(source, filename, symbol)
628+
finally:
629+
sys.excepthook = hook
630+
617631

618632
class HistoryDialog(QDialog, Ui_HistoryDialogPythonConsole):
619633

‎python/console/console_settings.py

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,12 @@
1919
Some portions of code were taken from https://code.google.com/p/pydee/
2020
"""
2121

22-
from PyQt4.QtCore import QCoreApplication, SIGNAL, QSize, QSettings, QFileInfo, Qt
23-
from PyQt4.QtGui import QDialog, QIcon, QFileDialog, QMessageBox, QTableWidgetItem, QFont, QColor
24-
from console_compile_apis import PrepareAPIDialog
22+
from PyQt.QtCore import QCoreApplication, QSize, QSettings, QFileInfo, Qt
23+
from PyQt.QtWidgets import QDialog, QFileDialog, QMessageBox, QTableWidgetItem
24+
from PyQt.QtGui import QIcon, QFont, QColor
25+
from .console_compile_apis import PrepareAPIDialog
2526

26-
from ui_console_settings import Ui_SettingsDialogPythonConsole
27+
from .ui_console_settings import Ui_SettingsDialogPythonConsole
2728

2829

2930
class optionsDialog(QDialog, Ui_SettingsDialogPythonConsole):
@@ -45,12 +46,9 @@ def __init__(self, parent):
4546
self.removeAPIpath.setIcon(QIcon(":/images/themes/default/symbologyRemove.svg"))
4647
self.removeAPIpath.setToolTip(QCoreApplication.translate("PythonConsole", "Remove API path"))
4748

48-
self.connect(self.preloadAPI,
49-
SIGNAL("stateChanged(int)"), self.initialCheck)
50-
self.connect(self.addAPIpath,
51-
SIGNAL("clicked()"), self.loadAPIFile)
52-
self.connect(self.removeAPIpath,
53-
SIGNAL("clicked()"), self.removeAPI)
49+
self.preloadAPI.stateChanged.connect(self.initialCheck)
50+
self.addAPIpath.clicked.connect(self.loadAPIFile)
51+
self.removeAPIpath.clicked.connect(self.removeAPI)
5452
self.compileAPIs.clicked.connect(self._prepareAPI)
5553

5654
self.resetFontColor.setIcon(QIcon(":/images/themes/default/console/iconResetColorConsole.png"))

0 commit comments

Comments
 (0)
Please sign in to comment.