1

Being new to Python I have looked around the site and found partial answers but nothing that helps make things clear. This is what I have. The main window through a button activates the thread which runs a command (wash -C -i monX) and a table needs to populate with the results in the GUI in real time. I found the code for the loop here Intercepting stdout of a subprocess while it is running. the code is here https://github.com/theodhori-dhiamanti/wifern/blob/master the code in question is:

class WashThread(QtCore.QThread):


def __init__(self, parent=None):
    super(WashThread, self).__init__(parent)

def run(self):
    global mon_iface
    try:
        if mon_iface != '':
            device = mon_iface
            cmd = ['wash', '-C', '-i', device]
            wash_cmd = Popen(cmd, stdout=PIPE)
            for line in iter(wash_cmd.stdout.readline, b''):
                if line.strip() == '' or line.startswith('---'): continue
                if line.startswith('Wash') or line.startswith('Copyright') or line.startswith('BSSID'): continue
                print line
                Split = line.split(' ')
                wash_bssid = Split[0]
                wash_essid = Split[58]
                wash_power = Split[19]
                wash_locked = Split[42]
        else:
            print('No Good')
    except OSError:
        pass

and the GUI part that calls this method and where the results need to be used is:

def wash(self):
    row = 0
    col = 0
    self.wash_tableWidget.setColumnCount(4)
    self.wash_tableWidget.setColumnWidth(1,150)
    self.wash_tableWidget.setColumnWidth(4,30)
    self.wash_tableWidget.setColumnWidth(3,70)
    self.wash_tableWidget.setRowCount(10)

    if self.start_wash_Button.text() == 'Start':
        self.start_wash_Button.setText('Stop')
        self.wash_thread.start()
        row_item = QtGui.QTableWidgetItem(wash_bssid)
        x = QtGui.QTableWidgetItem(wash_essid)
        y = QtGui.QTableWidgetItem(wash_power)
        z = QtGui.QTableWidgetItem(wash_locked)
        self.wash_tableWidget.setItem(row, col, row_item)
        self.wash_tableWidget.setItem(row, 1, x)
        self.wash_tableWidget.setItem(row, 2, y)
        self.wash_tableWidget.setItem(row, 3, z)
        row += 1
    else:
        try:
            os.kill(cmd.pid, SIGTERM)
            print('Done')
        except OSError:
            pass
        except UnboundLocalError:
            pass

self.wash_thread = WashThread() # method initialized in main body How can I transfer the output from the thread to the main portion? After I than can assign the values appropriately to the table fields? Any help is greatly appreciated. * Note: out of the thread the method works as intended.

Community
  • 1
  • 1
  • So I solved the problem by changing the design as follows: I added a QSqlQueryModel() to my table and using a sqlite3 database to populate the table with results. But because results were being added to the table I added a QFileSystemWatcher() that checks the database for changes and triggers a refresh method to repopulate the table. I hope that this solution could help someone NOT spent hours reading the Qt documentation. The code is at the above GitHub address – Theodhori Dhiamanti Mar 01 '15 at 02:28

0 Answers0