From 3750f748501ec83d60c489dfa700522f3be21b00 Mon Sep 17 00:00:00 2001
From: Bastian Bloessl <mail@bastibl.net>
Date: Sun, 16 Jun 2019 11:05:51 +0200
Subject: runtime: port ctrlport monitor to 3.8 and qt5

---
 .../gnuradio/ctrlport/GNURadioControlPortClient.py |  12 +-
 .../python/gnuradio/ctrlport/GrDataPlotter.py      |  18 +-
 .../gnuradio/ctrlport/RPCConnectionThrift.py       |  17 +-
 .../python/gnuradio/ctrlport/gr-ctrlport-monitor   | 261 ++++++++++-----------
 .../python/gnuradio/ctrlport/gr-perf-monitorx      |   4 +-
 .../python/gnuradio/ctrlport/monitor.py            |   6 +-
 6 files changed, 148 insertions(+), 170 deletions(-)

(limited to 'gnuradio-runtime/python/gnuradio')

diff --git a/gnuradio-runtime/python/gnuradio/ctrlport/GNURadioControlPortClient.py b/gnuradio-runtime/python/gnuradio/ctrlport/GNURadioControlPortClient.py
index 8249d341ec..bee5cd15ed 100644
--- a/gnuradio-runtime/python/gnuradio/ctrlport/GNURadioControlPortClient.py
+++ b/gnuradio-runtime/python/gnuradio/ctrlport/GNURadioControlPortClient.py
@@ -30,6 +30,8 @@ is currently the only supported transport.
 from __future__ import print_function
 from __future__ import unicode_literals
 
+from argparse import ArgumentParser
+
 from gnuradio.ctrlport.RPCConnection import RPCMethods
 try:
     from gnuradio.ctrlport.RPCConnectionThrift import RPCConnectionThrift
@@ -113,18 +115,18 @@ class GNURadioControlPortClient(object):
     """
 
     def __init__(self, argv = [], rpcmethod = 'thrift', callback = None, blockingcallback = None):
-        if len(argv) > 1: host = argv[1]
-        else: host = None
 
-        if len(argv) > 2: port = argv[2]
-        else: port = None
+        parser = ArgumentParser(description="GNU Radio Control Port Monitor")
+        parser.add_argument("host", nargs="?", default="localhost", help="host name or IP")
+        parser.add_argument("port", help="port")
+        args = parser.parse_args()
 
         self.client = None
 
         if rpcmethod in RPCMethods:
             if rpcmethod == 'thrift':
                 #print("making RPCConnectionThrift")
-                self.client = RPCConnectionThrift(host, port)
+                self.client = RPCConnectionThrift(args.host, args.port)
                 #print("made %s" % self.client)
 
                 #print("making callback call")
diff --git a/gnuradio-runtime/python/gnuradio/ctrlport/GrDataPlotter.py b/gnuradio-runtime/python/gnuradio/ctrlport/GrDataPlotter.py
index cb66baebb9..b29d069aca 100644
--- a/gnuradio-runtime/python/gnuradio/ctrlport/GrDataPlotter.py
+++ b/gnuradio-runtime/python/gnuradio/ctrlport/GrDataPlotter.py
@@ -31,26 +31,26 @@ import sys, time, struct
 
 try:
     from gnuradio import qtgui
-    from PyQt4 import QtGui, QtCore
+    from PyQt5 import Qt, QtCore
     import sip
 except ImportError:
-    print("Error: Program requires PyQt4 and gr-qtgui.")
+    print("Error: Program requires PyQt5 and gr-qtgui.")
     sys.exit(1)
 
-class GrDataPlotParent(gr.top_block, QtGui.QWidget):
+class GrDataPlotParent(gr.top_block, Qt.QWidget):
     # Setup signals
-    plotupdated = QtCore.pyqtSignal(QtGui.QWidget)
+    plotupdated = QtCore.pyqtSignal(Qt.QWidget)
 
     def __init__(self, name, rate, pmin=None, pmax=None):
         gr.top_block.__init__(self)
-        QtGui.QWidget.__init__(self, None)
+        Qt.QWidget.__init__(self, None)
 
         self._name = name
         self._npts = 500
         self._rate = rate
         self.knobnames = [name,]
 
-        self.layout = QtGui.QVBoxLayout()
+        self.layout = Qt.QVBoxLayout()
         self.setLayout(self.layout)
 
         self.setAcceptDrops(True)
@@ -89,7 +89,7 @@ class GrDataPlotParent(gr.top_block, QtGui.QWidget):
             else:
                 self.connect(self.src[n], (self.snk,n))
 
-        self.py_window = sip.wrapinstance(self.snk.pyqwidget(), QtGui.QWidget)
+        self.py_window = sip.wrapinstance(self.snk.pyqwidget(), Qt.QWidget)
 
         self.layout.addWidget(self.py_window)
 
@@ -416,7 +416,7 @@ class GrDataPlotterValueTable(object):
                           'Curent Value', 'Units', 'Description']):
         # must encapsulate, cuz Qt's bases are not classes
         self.uid = uid
-        self.treeWidget = QtGui.QTreeWidget(parent)
+        self.treeWidget = Qt.QTreeWidget(parent)
         self.treeWidget.setColumnCount(len(headers))
         self.treeWidget.setGeometry(x,y,xsize,ysize)
         self.treeWidget.setHeaderLabels(headers)
@@ -479,7 +479,7 @@ class GrDataPlotterValueTable(object):
                 elif(type(v) == str and k.find('probe2_b') == 0):
                     v = struct.unpack(len(v)*'b', v)
 
-                item = QtGui.QTreeWidgetItem([k, str(v),
+                item = Qt.QTreeWidgetItem([k, str(v),
                             knobprops[k].units, knobprops[k].description])
                 self.treeWidget.addTopLevelItem(item)
 
diff --git a/gnuradio-runtime/python/gnuradio/ctrlport/RPCConnectionThrift.py b/gnuradio-runtime/python/gnuradio/ctrlport/RPCConnectionThrift.py
index 466fc9fc04..3bc4c87308 100644
--- a/gnuradio-runtime/python/gnuradio/ctrlport/RPCConnectionThrift.py
+++ b/gnuradio-runtime/python/gnuradio/ctrlport/RPCConnectionThrift.py
@@ -41,10 +41,13 @@ class ThriftRadioClient(object):
         self.transport.open()
 
     def __del__(self):
-        self.radio.shutdown()
-        self.transport.close()
+        try:
+            self.transport.close()
+            self.radio.shutdown()
+        except:
+            pass
 
-    def getRadio(self, host, port):
+    def getRadio(self):
         return self.radio
 
 """
@@ -138,10 +141,10 @@ class RPCConnectionThrift(RPCConnection.RPCConnection):
 
     def newConnection(self, host=None, port=None):
         try:
-            self.thriftclient = ThriftRadioClient(self.getHost(), self.getPort())
-        except TTransport.TTransportException:
-            sys.stderr.write("Could not connect to ControlPort endpoint at {0}:{1}.\n\n".format(host, port))
-            sys.exit(1)
+            self.thriftclient = ThriftRadioClient(host, int(port))
+        except:
+            return None
+        return self
 
     def properties(self, *args):
         knobprops = self.thriftclient.radio.properties(*args)
diff --git a/gnuradio-runtime/python/gnuradio/ctrlport/gr-ctrlport-monitor b/gnuradio-runtime/python/gnuradio/ctrlport/gr-ctrlport-monitor
index c866776355..dfaba52c0c 100644
--- a/gnuradio-runtime/python/gnuradio/ctrlport/gr-ctrlport-monitor
+++ b/gnuradio-runtime/python/gnuradio/ctrlport/gr-ctrlport-monitor
@@ -20,21 +20,20 @@
 # Boston, MA 02110-1301, USA.
 #
 
-from PyQt4 import QtCore,Qt
-import PyQt4.QtGui as QtGui
+from PyQt5 import QtCore, Qt
 import os, sys, time, struct
 
 from gnuradio import gr, ctrlport
 from gnuradio.ctrlport.GrDataPlotter import *
 
-class RateDialog(QtGui.QDialog):
+class RateDialog(Qt.QDialog):
     def __init__(self, delay, parent=None):
         super(RateDialog, self).__init__(parent)
-        self.gridLayout = QtGui.QGridLayout(self)
+        self.gridLayout = Qt.QGridLayout(self)
         self.setWindowTitle("Update Delay (ms)");
-        self.delay = QtGui.QLineEdit(self);
+        self.delay = Qt.QLineEdit(self);
         self.delay.setText(str(delay));
-        self.buttonBox = QtGui.QDialogButtonBox(QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.Cancel)
+        self.buttonBox = Qt.QDialogButtonBox(Qt.QDialogButtonBox.Ok | Qt.QDialogButtonBox.Cancel)
         self.gridLayout.addWidget(self.delay);
         self.gridLayout.addWidget(self.buttonBox);
         self.buttonBox.accepted.connect(self.accept)
@@ -44,9 +43,9 @@ class RateDialog(QtGui.QDialog):
     def reject(self):
         self.done(0);
 
-class MAINWindow(QtGui.QMainWindow):
+class MAINWindow(Qt.QMainWindow):
     def minimumSizeHint(self):
-        return Qtgui.QSize(800,600)
+        return Qt.QSize(800,600)
 
     def __init__(self, radioclient):
 
@@ -57,14 +56,14 @@ class MAINWindow(QtGui.QMainWindow):
         self.plots = []
         self.knobprops = []
 
-        self.mdiArea = QtGui.QMdiArea()
+        self.mdiArea = Qt.QMdiArea()
         self.mdiArea.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
         self.mdiArea.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
         self.setCentralWidget(self.mdiArea)
 
         self.mdiArea.subWindowActivated.connect(self.updateMenus)
         self.windowMapper = QtCore.QSignalMapper(self)
-        self.windowMapper.mapped[QtGui.QWidget].connect(self.setActiveSubWindow)
+        self.windowMapper.mapped[Qt.QWidget].connect(self.setActiveSubWindow)
 
         self.createActions()
         self.createMenus()
@@ -76,7 +75,7 @@ class MAINWindow(QtGui.QMainWindow):
         self.setUnifiedTitleAndToolBarOnMac(True)
 
         self.newCon(radioclient)
-        icon = QtGui.QIcon(ctrlport.__path__[0] + "/icon.png" )
+        icon = Qt.QIcon(ctrlport.__path__[0] + "/icon.png" )
         self.setWindowIcon(icon)
 
         # Locally turn off ControlPort export from GR. This prevents
@@ -97,8 +96,8 @@ class MAINWindow(QtGui.QMainWindow):
             child.setWindowTitle(str(child.radioclient))
             self.mdiArea.addSubWindow(child)
             self.mdiArea.currentSubWindow().showMaximized()
-        self.conns.append(child)
-        self.plots.append([])
+            self.conns.append(child)
+            self.plots.append([])
 
     def propertiesMenu(self, key, radio, uid):
         title = str(radio)
@@ -110,11 +109,11 @@ class MAINWindow(QtGui.QMainWindow):
         # Use display option mask of item to set up available plot
         # types and default options.
         disp = self.knobprops[uid][key].display
-        cplx = disp & gr.DISPOPTCPLX | disp & gr.DISPXY
-        strip = disp & gr.DISPOPTSTRIP
-        stem = disp & gr.DISPOPTSTEM
-        log = disp & gr.DISPOPTLOG
-        scatter = disp & gr.DISPOPTSCATTER
+        cplx = bool(disp & gr.DISPOPTCPLX | disp & gr.DISPXY)
+        strip = bool(disp & gr.DISPOPTSTRIP)
+        stem = bool(disp & gr.DISPOPTSTEM)
+        log = bool(disp & gr.DISPOPTLOG)
+        scatter = bool(disp & gr.DISPOPTSCATTER)
 
         def newUpdaterProxy():
             self.newUpdater(key, radio)
@@ -143,7 +142,7 @@ class MAINWindow(QtGui.QMainWindow):
         def newPlotterRasterBProxy():
             self.newPlotRasterB(key, uid, title, pmin, pmax)
 
-        menu = QtGui.QMenu(self)
+        menu = Qt.QMenu(self)
         menu.setTitle("Item Actions")
         menu.setTearOffEnabled(False)
 
@@ -161,7 +160,7 @@ class MAINWindow(QtGui.QMainWindow):
             menu.addAction("Plot PSD", newPlotterPsdCProxy)
             menu.addAction("Plot Constellation", newPlotterConstProxy)
 
-        menu.popup(QtGui.QCursor.pos())
+        menu.popup(Qt.QCursor.pos())
 
     def newUpdater(self, key, radio):
         updater = UpdaterWindow(key, radio, None)
@@ -176,16 +175,14 @@ class MAINWindow(QtGui.QMainWindow):
         knobprop = self.knobprops[uid][tag]
 
         strr = str(tree.radioclient)
-        print(strr)
-#         r = strr.split(" ")
         title = strr #title = "{0}:{1}".format(r[3], r[5])
         pmin,pmax = get_minmax(knobprop)
 
         disp = knobprop.display
         if(disp & gr.DISPTIME):
-            strip = disp & gr.DISPOPTSTRIP
-            stem = disp & gr.DISPOPTSTEM
-            log = disp & gr.DISPOPTLOG
+            strip = bool(disp & gr.DISPOPTSTRIP)
+            stem = bool(disp & gr.DISPOPTSTEM)
+            log = bool(disp & gr.DISPOPTLOG)
             if(disp & gr.DISPOPTCPLX == 0):
                 self.newPlotF(tag, uid, title, pmin, pmax,
                               log, strip, stem)
@@ -204,7 +201,7 @@ class MAINWindow(QtGui.QMainWindow):
                 self.newPlotPsdC(tag, uid, title)
 
     def startDrag(self, e):
-        drag = QtGui.QDrag(self)
+        drag = Qt.QDrag(self)
         mime_data = QtCore.QMimeData()
 
         tag = str(e.text(0))
@@ -221,7 +218,7 @@ class MAINWindow(QtGui.QMainWindow):
         mime_data.setText(data)
         drag.setMimeData(mime_data)
 
-        drop = drag.start()
+        drop = drag.exec()
 
     def createPlot(self, plot, uid, title):
         plot.start()
@@ -229,9 +226,7 @@ class MAINWindow(QtGui.QMainWindow):
 
         self.mdiArea.addSubWindow(plot)
         plot.setWindowTitle("{0}: {1}".format(title, plot.name()))
-        self.connect(plot.qwidget(),
-                     QtCore.SIGNAL('destroyed(QObject*)'),
-                     self.destroyPlot)
+        plot.qwidget().destroyed.connect(lambda obj=None, plot=plot: self.destroyPlot(plot=plot)),
 
         # when the plot is updated via drag-and-drop, we need to be
         # notified of the new qwidget that's created so we can
@@ -248,15 +243,13 @@ class MAINWindow(QtGui.QMainWindow):
                 if(p == q):
                     #plots.remove(p)
                     #plots.append(q)
-                    self.connect(q.qwidget(),
-                                 QtCore.SIGNAL('destroyed(QObject*)'),
-                                 self.destroyPlot)
+                    q.qwidget().destroyed.connect(lambda obj=None, plot=p: self.destroyPlot(plot=plot))
                     break
 
-    def destroyPlot(self, obj):
+    def destroyPlot(self, plot):
         for plots in self.plots:
             for p in plots:
-                if p.qwidget() == obj:
+                if p == plot:
                     plots.remove(p)
                     break
 
@@ -302,9 +295,6 @@ class MAINWindow(QtGui.QMainWindow):
             data = []
             for n in plot.knobnames:
                 d = knobs[n].value
-                # TODO: FIX COMPLEX!
-#                 if(type(d) == GNURadio.complex):
-#                     d = [d.re, d.im]
 
                 # If it's a byte stream, Python thinks it's a string.
                 # Unpack and convert to floats for plotting.
@@ -324,57 +314,57 @@ class MAINWindow(QtGui.QMainWindow):
 
 
     def createActions(self):
-        self.newConAct = QtGui.QAction("&New Connection",
-                self, shortcut=QtGui.QKeySequence.New,
+        self.newConAct = Qt.QAction("&New Connection",
+                self, shortcut=Qt.QKeySequence.New,
                 statusTip="Create a new file", triggered=self.newCon)
 
-        self.exitAct = QtGui.QAction("E&xit", self, shortcut="Ctrl+Q",
+        self.exitAct = Qt.QAction("E&xit", self, shortcut="Ctrl+Q",
                 statusTip="Exit the application",
-                triggered=QtGui.qApp.closeAllWindows)
+                triggered=Qt.qApp.closeAllWindows)
 
-        self.closeAct = QtGui.QAction("Cl&ose", self, shortcut="Ctrl+F4",
+        self.closeAct = Qt.QAction("Cl&ose", self, shortcut="Ctrl+F4",
                 statusTip="Close the active window",
                 triggered=self.mdiArea.closeActiveSubWindow)
 
-        self.closeAllAct = QtGui.QAction("Close &All", self,
+        self.closeAllAct = Qt.QAction("Close &All", self,
                 statusTip="Close all the windows",
                 triggered=self.mdiArea.closeAllSubWindows)
 
-        self.urAct = QtGui.QAction("Update Rate", self, shortcut="F5",
+        self.urAct = Qt.QAction("Update Rate", self, shortcut="F5",
                 statusTip="Change Update Rate",
                 triggered=self.updateRateShow)
 
-        qks = QtGui.QKeySequence(QtCore.Qt.CTRL + QtCore.Qt.Key_T);
-        self.tileAct = QtGui.QAction("&Tile", self,
+        qks = Qt.QKeySequence(QtCore.Qt.CTRL + QtCore.Qt.Key_T);
+        self.tileAct = Qt.QAction("&Tile", self,
                 statusTip="Tile the windows",
                 triggered=self.mdiArea.tileSubWindows,
                 shortcut=qks)
 
-        qks = QtGui.QKeySequence(QtCore.Qt.CTRL + QtCore.Qt.Key_C);
-        self.cascadeAct = QtGui.QAction("&Cascade", self,
+        qks = Qt.QKeySequence(QtCore.Qt.CTRL + QtCore.Qt.Key_C);
+        self.cascadeAct = Qt.QAction("&Cascade", self,
                 statusTip="Cascade the windows", shortcut=qks,
                 triggered=self.mdiArea.cascadeSubWindows)
 
-        self.nextAct = QtGui.QAction("Ne&xt", self,
-                shortcut=QtGui.QKeySequence.NextChild,
+        self.nextAct = Qt.QAction("Ne&xt", self,
+                shortcut=Qt.QKeySequence.NextChild,
                 statusTip="Move the focus to the next window",
                 triggered=self.mdiArea.activateNextSubWindow)
 
-        self.previousAct = QtGui.QAction("Pre&vious", self,
-                shortcut=QtGui.QKeySequence.PreviousChild,
+        self.previousAct = Qt.QAction("Pre&vious", self,
+                shortcut=Qt.QKeySequence.PreviousChild,
                 statusTip="Move the focus to the previous window",
                 triggered=self.mdiArea.activatePreviousSubWindow)
 
-        self.separatorAct = QtGui.QAction(self)
+        self.separatorAct = Qt.QAction(self)
         self.separatorAct.setSeparator(True)
 
-        self.aboutAct = QtGui.QAction("&About", self,
+        self.aboutAct = Qt.QAction("&About", self,
                 statusTip="Show the application's About box",
                 triggered=self.about)
 
-        self.aboutQtAct = QtGui.QAction("About &Qt", self,
+        self.aboutQtAct = Qt.QAction("About &Qt", self,
                 statusTip="Show the Qt library's About box",
-                triggered=QtGui.qApp.aboutQt)
+                triggered=Qt.qApp.aboutQt)
 
     def createMenus(self):
         self.fileMenu = self.menuBar().addMenu("&File")
@@ -451,22 +441,22 @@ GNU Radio is free software; you can redistribute it and/or modify it under the t
 GNU Radio is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.\n
 You should have received a copy of the GNU General Public License along with GNU Radio; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Boston, MA 02110-1301, USA.'''
 
-        QtGui.QMessageBox.about(None, "gr-ctrlport-monitor", about_info)
+        Qt.QMessageBox.about(None, "gr-ctrlport-monitor", about_info)
 
 
-class ConInfoDialog(QtGui.QDialog):
+class ConInfoDialog(Qt.QDialog):
     def __init__(self, parent=None):
         super(ConInfoDialog, self).__init__(parent)
 
-        self.gridLayout = QtGui.QGridLayout(self)
+        self.gridLayout = Qt.QGridLayout(self)
 
 
-        self.host = QtGui.QLineEdit(self);
-        self.port = QtGui.QLineEdit(self);
+        self.host = Qt.QLineEdit(self);
+        self.port = Qt.QLineEdit(self);
         self.host.setText("localhost");
         self.port.setText("43243");
 
-        self.buttonBox = QtGui.QDialogButtonBox(QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.Cancel)
+        self.buttonBox = Qt.QDialogButtonBox(Qt.QDialogButtonBox.Ok | Qt.QDialogButtonBox.Cancel)
 
         self.gridLayout.addWidget(self.host);
         self.gridLayout.addWidget(self.port);
@@ -483,20 +473,20 @@ class ConInfoDialog(QtGui.QDialog):
         self.done(0);
 
 
-class UpdaterWindow(QtGui.QDialog):
+class UpdaterWindow(Qt.QDialog):
     def __init__(self, key, radio, parent):
-        QtGui.QDialog.__init__(self, parent)
+        Qt.QDialog.__init__(self, parent)
 
         self.key = key;
         self.radio = radio
 
         self.resize(300,200)
-        self.layout = QtGui.QVBoxLayout()
+        self.layout = Qt.QVBoxLayout()
 
         self.props = radio.properties([key])[key]
         info = radio.printProperties(self.props)
 
-        self.infoLabel = QtGui.QLabel(info)
+        self.infoLabel = Qt.QLabel(info)
         self.layout.addWidget(self.infoLabel)
 
         # Test here to make sure that a 'set' function exists
@@ -508,20 +498,20 @@ class UpdaterWindow(QtGui.QDialog):
 
 
         if(has_set is False):
-            self.cancelButton = QtGui.QPushButton("Ok")
-            self.cancelButton.connect(self.cancelButton, QtCore.SIGNAL('clicked()'), self.reject)
+            self.cancelButton = Qt.QPushButton("Ok")
+            self.cancelButton.clicked.connect(self.reject)
 
-            self.buttonlayout = QtGui.QHBoxLayout()
+            self.buttonlayout = Qt.QHBoxLayout()
             self.buttonlayout.addWidget(self.cancelButton)
             self.layout.addLayout(self.buttonlayout)
 
         else: # we have a set function
-            self.textInput = QtGui.QLineEdit()
+            self.textInput = Qt.QLineEdit()
             self.layout.addWidget(self.textInput)
 
-            self.applyButton = QtGui.QPushButton("Apply")
-            self.setButton = QtGui.QPushButton("OK")
-            self.cancelButton = QtGui.QPushButton("Cancel")
+            self.applyButton = Qt.QPushButton("Apply")
+            self.setButton = Qt.QPushButton("OK")
+            self.cancelButton = Qt.QPushButton("Cancel")
 
             rv = radio.getKnobs([key])
             val = rv[key].value
@@ -531,19 +521,19 @@ class UpdaterWindow(QtGui.QDialog):
             self.textInput.setText(str(val))
             self.sv = rv[key]
 
-            self.applyButton.connect(self.applyButton, QtCore.SIGNAL('clicked()'), self._apply)
-            self.setButton.connect(self.setButton, QtCore.SIGNAL('clicked()'), self._set)
-            self.cancelButton.connect(self.cancelButton, QtCore.SIGNAL('clicked()'), self.reject)
+            self.applyButton.clicked.connect(self._apply)
+            self.setButton.clicked.connect(self._set)
+            self.cancelButton.clicked.connect(self.reject)
 
             self.is_num = ((type(self.sv.value)==float) or (type(self.sv.value)==int))
             if(self.is_num):
-                self.sliderlayout = QtGui.QHBoxLayout()
+                self.sliderlayout = Qt.QHBoxLayout()
 
-                self.slider = QtGui.QSlider(QtCore.Qt.Horizontal)
+                self.slider = Qt.QSlider(QtCore.Qt.Horizontal)
 
-                self.sliderlayout.addWidget(QtGui.QLabel(str(self.props.min.value)))
+                self.sliderlayout.addWidget(Qt.QLabel(str(self.props.min.value)))
                 self.sliderlayout.addWidget(self.slider)
-                self.sliderlayout.addWidget(QtGui.QLabel(str(self.props.max.value)))
+                self.sliderlayout.addWidget(Qt.QLabel(str(self.props.max.value)))
 
                 self.steps = 10000
                 self.valspan = self.props.max.value - self.props.min.value
@@ -551,13 +541,13 @@ class UpdaterWindow(QtGui.QDialog):
                 self.slider.setRange(0, 10000)
                 self._set_slider_value(self.sv.value)
 
-                self.connect(self.slider, QtCore.SIGNAL("sliderReleased()"), self._slide)
+                self.slider.sliderReleased.connect(self._slide)
 
                 self.layout.addLayout(self.sliderlayout)
             else:
                 self._set_slider_value = None
 
-            self.buttonlayout = QtGui.QHBoxLayout()
+            self.buttonlayout = Qt.QHBoxLayout()
             self.buttonlayout.addWidget(self.applyButton)
             self.buttonlayout.addWidget(self.setButton)
             self.buttonlayout.addWidget(self.cancelButton)
@@ -570,7 +560,7 @@ class UpdaterWindow(QtGui.QDialog):
         self.slider.setValue(self.steps*(val-self.props.min.value)/self.valspan)
 
     def _slide(self):
-        val = (self.slider.value()*self.valspan + self.props.min.value)/float(self.steps)
+        val = self.props.min.value + (self.slider.value()/float(self.steps)*self.valspan)
         self.textInput.setText(str(val))
 
     def _apply(self):
@@ -602,53 +592,49 @@ class UpdaterWindow(QtGui.QDialog):
         self.done(0)
 
 
-class MForm(QtGui.QWidget):
+class MForm(Qt.QWidget):
     def update(self):
         # TODO: revisit this try-except block, figure out what it's doing, and if we need to keep it. at very lease makes debugging dificult
-        if True: #try:
+        try:
             st = time.time();
             knobs = self.radioclient.getKnobs([])
             ft = time.time();
             latency = ft-st;
             self.parent.statusBar().showMessage("Current GNU Radio Control Port Query Latency: %f ms"%(latency*1000))
 
-#         except Exception, e:
-#             sys.stderr.write("ctrlport-monitor: radio.get threw exception ({0}).\n".format(e))
-#             if(type(self.parent) is MAINWindow):
-#                 # Find window of connection
-#                 remove = []
-#                 for p in self.parent.mdiArea.subWindowList():
-#                     if self.parent.conns[self.uid] == p.widget():
-#                         remove.append(p)
-#
-#                 # Find any subplot windows of connection
-#                 for p in self.parent.mdiArea.subWindowList():
-#                     for plot in self.parent.plots[self.uid]:
-#                         if plot.qwidget() == p.widget():
-#                             remove.append(p)
-#
-#                 # Clean up local references to these
-#                 self.parent.conns.remove(self.parent.conns[self.uid])
-#                 self.parent.plots.remove(self.parent.plots[self.uid])
-#
-#                 # Remove subwindows for connection and plots
-#                 for r in remove:
-#                     self.parent.mdiArea.removeSubWindow(r)
-#
-#                 # Clean up self
-#                 self.close()
-#             else:
-#                 sys.exit(1)
-#             return
+        except Exception as e:
+            sys.stderr.write("ctrlport-monitor: radio.get threw exception ({0}).\n".format(e))
+            if(type(self.parent) is MAINWindow):
+                # Find window of connection
+                remove = []
+                for p in self.parent.mdiArea.subWindowList():
+                    if self.parent.conns[self.uid] == p.widget():
+                        remove.append(p)
+
+                # Find any subplot windows of connection
+                for p in self.parent.mdiArea.subWindowList():
+                    for plot in self.parent.plots[self.uid]:
+                        if plot.qwidget() == p.widget():
+                            remove.append(p)
+
+                # Clean up local references to these
+                self.parent.conns.remove(self.parent.conns[self.uid])
+                self.parent.plots.remove(self.parent.plots[self.uid])
+
+                # Remove subwindows for connection and plots
+                for r in remove:
+                    self.parent.mdiArea.removeSubWindow(r)
+
+                # Clean up self
+                self.close()
+            else:
+                sys.exit(1)
+            return
 
         tableitems = knobs.keys()
 
         #UPDATE TABLE:
-        #try:
         self.table.updateItems(knobs, self.knobprops)
-        #except:
-        #    self.knobprops = self.radioclient.properties([])
-        #    print("knobsprops1:", len(self.knobprops))
 
         #UPDATE PLOTS
         self.parent.update(knobs, self.uid)
@@ -658,32 +644,26 @@ class MForm(QtGui.QWidget):
 
         super(MForm, self).__init__()
         self.radioclient = radioclient
-#         print("before radioclient.getHost()", radioclient.getHost(), radioclient.getPort(), "prompt", prompt)
         if(dialogprompt or radioclient.getHost() is None or radioclient.getPort() is None):
-#             print("before ConInfoDialog")
             askinfo = ConInfoDialog(self);
             if askinfo.exec_():
                 host = str(askinfo.host.text());
                 port = str(askinfo.port.text());
-#                 print("before radioclient.newConnection host: %s port: %s"%(host,port))
-                newradio = self.radioclient.newConnection(host, port)
-                if newradio is None:
-                    print("Error making a %s connection to %s:%s from %s" % (radioclient.getName(), host, port, radioclient))
+                self.radioclient = self.radioclient.newConnection(host, port)
+                if self.radioclient is None:
+                    print("Cannot connect to %s:%s" % (host, port))
                 else:
-                    self.radioclient = newradio
-
-            else:
-                self.radioclient = Nonclient = None
-                return
+                    print("Connected to %s:%s" % (host, port))
 
+        if self.radioclient is None:
+            return
 
         self.uid = uid
         self.parent = parent
-        self.horizontalLayout = QtGui.QVBoxLayout(self)
-        self.gridLayout = QtGui.QGridLayout()
+        self.horizontalLayout = Qt.QVBoxLayout(self)
+        self.gridLayout = Qt.QGridLayout()
 
         self.knobprops = self.radioclient.properties([])
-        #print("props5:", self.knobprops)
         self.parent.knobprops.append(self.knobprops)
         self.resize(775,500)
         self.timer = QtCore.QTimer()
@@ -693,9 +673,9 @@ class MForm(QtGui.QWidget):
 
         # make table
         self.table = GrDataPlotterValueTable(uid, self, 0, 0, 400, 200)
-        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred)
+        sizePolicy = Qt.QSizePolicy(Qt.QSizePolicy.Preferred, Qt.QSizePolicy.Preferred)
         self.table.treeWidget.setSizePolicy(sizePolicy)
-        self.table.treeWidget.setEditTriggers(QtGui.QAbstractItemView.EditKeyPressed)
+        self.table.treeWidget.setEditTriggers(Qt.QAbstractItemView.EditKeyPressed)
         self.table.treeWidget.setSortingEnabled(True)
         self.table.treeWidget.setDragEnabled(True)
 
@@ -703,7 +683,7 @@ class MForm(QtGui.QWidget):
         self.horizontalLayout.addWidget(self.table.treeWidget)
 
         # set up timer
-        self.connect(self.timer, QtCore.SIGNAL('timeout()'), self.update)
+        self.timer.timeout.connect(self.update)
         self.updateRate = updateRate;
         self.timer.start(self.updateRate)
 
@@ -712,14 +692,9 @@ class MForm(QtGui.QWidget):
         self.table.treeWidget.customContextMenuRequested.connect(self.openMenu)
 
         # Set up double-click to launch default plotter
-        self.connect(self.table.treeWidget,
-                     QtCore.SIGNAL('itemDoubleClicked(QTreeWidgetItem*, int)'),
-                     self.parent.newSub);
-
+        self.table.treeWidget.itemDoubleClicked.connect(self.parent.newSub)
         # Allow drag/drop event from table item to plotter
-        self.connect(self.table.treeWidget,
-                     QtCore.SIGNAL('itemPressed(QTreeWidgetItem*, int)'),
-                     self.parent.startDrag)
+        self.table.treeWidget.itemPressed.connect(self.parent.startDrag)
 
     def openMenu(self, pos):
         index = self.table.treeWidget.selectedIndexes()
@@ -763,7 +738,7 @@ def get_minmax(p):
 class MyApp(object):
     def __init__(self, args):
         from gnuradio.ctrlport.GNURadioControlPortClient import GNURadioControlPortClient
-        GNURadioControlPortClient(args, 'thrift', self.run, QtGui.QApplication(sys.argv).exec_)
+        GNURadioControlPortClient(args, 'thrift', self.run, Qt.QApplication(sys.argv).exec_)
 
     def run(self, client):
         MAINWindow(client).show()
diff --git a/gnuradio-runtime/python/gnuradio/ctrlport/gr-perf-monitorx b/gnuradio-runtime/python/gnuradio/ctrlport/gr-perf-monitorx
index 070eba96cf..9f974bc53c 100644
--- a/gnuradio-runtime/python/gnuradio/ctrlport/gr-perf-monitorx
+++ b/gnuradio-runtime/python/gnuradio/ctrlport/gr-perf-monitorx
@@ -346,7 +346,7 @@ class DataTable(QtGui.QWidget):
 
         # set up timer
         self.timer = QtCore.QTimer()
-        self.connect(self.timer, QtCore.SIGNAL('timeout()'), self.update)
+        self.timer.timeout.connect(self.update)
         self.timer.start(500)
 
         for i in range(0,len(nodes)):
@@ -817,7 +817,7 @@ class MForm(QtGui.QWidget):
 
         # set up timer
         self.timer = QtCore.QTimer()
-        self.connect(self.timer, QtCore.SIGNAL('timeout()'), self.update)
+        self.timer.timeout.connect(self.update)
         self.timer.start(1000)
 
         # Set up mouse callback functions to move blocks around.
diff --git a/gnuradio-runtime/python/gnuradio/ctrlport/monitor.py b/gnuradio-runtime/python/gnuradio/ctrlport/monitor.py
index 0cc05be63e..3215fa5b26 100644
--- a/gnuradio-runtime/python/gnuradio/ctrlport/monitor.py
+++ b/gnuradio-runtime/python/gnuradio/ctrlport/monitor.py
@@ -47,10 +47,8 @@ class monitor(object):
     def start(self):
         print("monitor::endpoints() = %s" % (gr.rpcmanager_get().endpoints()))
         try:
-            cmd = map(lambda a: [self.tool,
-                                 re.search(r"-h (\S+|\d+\.\d+\.\d+\.\d+)",a).group(1),
-                                 re.search(r"-p (\d+)",a).group(1)],
-                      gr.rpcmanager_get().endpoints())[0]
+            ep = gr.rpcmanager_get().endpoints()[0]
+            cmd = [self.tool, re.search(r"-h (\S+|\d+\.\d+\.\d+\.\d+)", ep).group(1), re.search(r"-p (\d+)", ep).group(1)]
             print("running: %s"%(str(cmd)))
             self.proc = subprocess.Popen(cmd);
             self.started = True
-- 
cgit v1.2.3