0

I have a python GUI script with 4 buttons that call 4 relevant external scripts. On the click of each button, each relevant external script is run and it creates a separate csv file for each with data in them. The problem is that when I press the buttons on the GUI, it seems to run the corresponding scripts more than once, therby generating double the data in each csv. I do not want this, I only want the script to run once upon click to generate the data once. What should I do to stop the script from calling multiple times on the button click?

# Main Class that holds User Interface Objects
class Ui_MainWindow(object):

    # Function for Opening Report Viewer Window From Main Window by clicking View Reports button
    def openReportViewer(self):
        self.window = QtWidgets.QMainWindow()
        self.ui = Ui_reportViewerWindow()
        self.ui.setupUi(self.window)
        self.window.show()



    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.setFixedSize(834, 428)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.MinimumExpanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
        MainWindow.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setFamily("Arial")
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        MainWindow.setFont(font)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")

        # Sim Card Button
        self.simCardButton = QtWidgets.QPushButton(self.centralwidget)
        self.simCardButton.setGeometry(QtCore.QRect(30, 200, 211, 30))
        self.simCardButton.setToolTip("Select to parse sim card data")
        font = QtGui.QFont()
        font.setFamily("Arial")
        font.setPointSize(14)
        self.simCardButton.setFont(font)
        self.simCardButton.setObjectName("simCardButton")

        # Call Logs Button
        self.callLogButton = QtWidgets.QPushButton(self.centralwidget)
        self.callLogButton.setGeometry(QtCore.QRect(30, 300, 211, 30))
        self.callLogButton.setToolTip("Select to parse call log data")
        font = QtGui.QFont()
        font.setFamily("Arial")
        font.setPointSize(14)
        self.callLogButton.setFont(font)
        self.callLogButton.setObjectName("callLogButton")

        # SMS Button
        self.smsButton = QtWidgets.QPushButton(self.centralwidget)
        self.smsButton.setGeometry(QtCore.QRect(30, 250, 211, 30))
        self.smsButton.setToolTip("Select to parse sms data")
        font = QtGui.QFont()
        font.setFamily("Arial")
        font.setPointSize(14)
        self.smsButton.setFont(font)
        self.smsButton.setObjectName("smsButton")

        # Canonical Address Button
        self.canonicalAddressesButton = QtWidgets.QPushButton(self.centralwidget)
        self.canonicalAddressesButton.setGeometry(QtCore.QRect(30, 150, 211, 30))
        self.canonicalAddressesButton.setToolTip("Select to parse canonical address data")
        font = QtGui.QFont()
        font.setFamily("Arial")
        font.setPointSize(14)
        self.canonicalAddressesButton.setFont(font)
        self.canonicalAddressesButton.setObjectName("canonicalAddressesButton")

        # Main Window Label
        self.windowMainLabel = QtWidgets.QLabel(self.centralwidget)
        self.windowMainLabel.setGeometry(QtCore.QRect(200, 20, 423, 32))
        font = QtGui.QFont()
        font.setFamily("Arial")
        font.setPointSize(20)
        font.setBold(True)
        font.setWeight(75)
        self.windowMainLabel.setFont(font)
        self.windowMainLabel.setAlignment(QtCore.Qt.AlignCenter)
        self.windowMainLabel.setObjectName("windowMainLabel")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(30, 110, 291, 20))
        self.label.setObjectName("label")

        # Combo Box settings
        self.ViewDataCB = QtWidgets.QComboBox(self.centralwidget)
        self.ViewDataCB.setGeometry(QtCore.QRect(560, 150, 231, 22))
        self.ViewDataCB.setToolTip("Choose data report type")
        self.ViewDataCB.setObjectName("ViewDataCB")
        self.ViewDataCB.addItem("canonical address")
        self.ViewDataCB.addItem("sim card")
        self.ViewDataCB.addItem("sms")
        self.ViewDataCB.addItem("call logs")
        self.ViewDataCB.addItem("choice prompt")
        self.ViewDataCB.addItem("full report")

        # # View Evidence Button
        self.viewReportsButton = QtWidgets.QPushButton(self.centralwidget)
        font = QtGui.QFont()
        font.setFamily("Arial")
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.viewReportsButton.setFont(font)
        self.viewReportsButton.setObjectName("viewReportsButton")



        # Label for evidence viewer
        self.evidenceViewingLabel = QtWidgets.QLabel(self.centralwidget)
        self.evidenceViewingLabel.setGeometry(QtCore.QRect(660, 120, 141, 16))
        self.evidenceViewingLabel.setObjectName("evidenceViewingLabel")
        self.generateReportButton = QtWidgets.QPushButton(self.centralwidget)
        self.generateReportButton.setGeometry(QtCore.QRect(650, 320, 141, 31))
        self.generateReportButton.setObjectName("generateReportButton")
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.actionOpen = QtWidgets.QAction(MainWindow)
        self.actionOpen.setObjectName("actionOpen")
        self.actionExit = QtWidgets.QAction(MainWindow)
        self.actionExit.setObjectName("actionExit")
        self.actionOpen_2 = QtWidgets.QAction(MainWindow)
        self.actionOpen_2.setObjectName("actionOpen_2")
        self.actionExit_2 = QtWidgets.QAction(MainWindow)
        self.actionExit_2.setObjectName("actionExit_2")

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    # Function that sets the text on all the UI Buttons
    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "SQLite DB Android Parser"))
        self.simCardButton.setText(_translate("MainWindow", "Sim Card"))
        self.callLogButton.setText(_translate("MainWindow", "Call Logs"))
        self.smsButton.setText(_translate("MainWindow", "SMS "))
        self.canonicalAddressesButton.setText(_translate("MainWindow", "Canonical Addresses"))
        self.windowMainLabel.setText(_translate("MainWindow", "SQLite Android Database Parser"))
        self.label.setText(_translate("MainWindow", "Please Choose Data Parsing Option"))
        self.ViewDataCB.setItemText(0, _translate("MainWindow", "Choose An Option"))
        self.ViewDataCB.setItemText(1, _translate("MainWindow", "Canonical Address Report"))
        self.ViewDataCB.setItemText(2, _translate("MainWindow", "Sim Card Report"))
        self.ViewDataCB.setItemText(3, _translate("MainWindow", "SMS Report"))
        self.ViewDataCB.setItemText(4, _translate("MainWindow", "Call Log Report"))
        self.ViewDataCB.setItemText(5, _translate("MainWindow", "Full Evidence Report"))
        self.viewReportsButton.setText(_translate("MainWindow", "View Reports"))
        self.viewReportsButton.setToolTip("Select to open report viewing window")
        self.evidenceViewingLabel.setText(_translate("MainWindow", "Report Generator"))
        self.generateReportButton.setText(_translate("MainWindow", "Generate Report"))
        self.generateReportButton.setToolTip("Select to generate report")
        self.actionOpen.setText(_translate("MainWindow", "Open"))
        self.actionExit.setText(_translate("MainWindow", "Exit"))
        self.actionOpen_2.setText(_translate("MainWindow", "Open"))
        self.actionExit_2.setText(_translate("MainWindow", "Exit"))

    # Event Handling Code Section

        # Event Handling to open Report Viewer Window
        self.viewReportsButton.setGeometry(QtCore.QRect(650, 360, 141, 31))
        self.viewReportsButton.clicked.connect(self.openReportViewer)


        # Canonical Addresses Button click functionality to parse canonical address data
        self.canonicalAddressesButton.clicked.connect(self.select_canonical_data)

    def select_canonical_data(self):
        os.system('CanonicalAddressesParser.py')



        # Call Logs Button click functionality to parse call log data
        self.callLogButton.clicked.connect(self.select_call_data)

    def select_call_data(self):
        os.system('CallLogParser.py')



        # SMS Button click functionality to parse SMS data
        self.smsButton.clicked.connect(self.select_sms_data)

    def select_sms_data(self):
        os.system('SmsParser.py')



        # Sim Card Button click functionality to parse sim card data
        self.simCardButton.clicked.connect(self.select_sim_data)

    def select_sim_data(self):
        os.system('SimCardParser.py')



if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
5
  • your buttons are working ? ... Commented Feb 23, 2018 at 10:14
  • Yes but lets say I run self.smsButton.clicked.connect(self.select_sms_data) def select_sms_data(self): os.system('SmsParser.py') It creates the data maybe 2 or 3 times as soon as I click it, instead of just creating it once. Commented Feb 23, 2018 at 10:17
  • I also cannot click any of these 4 buttons in any order. It seems the CanonicalAddresses button has to be clicked first before any others. Commented Feb 23, 2018 at 10:18
  • yes it must, I'll explain why Commented Feb 23, 2018 at 10:19
  • Yeah I tested it there, I moved one function above the other. The top function is the only one that works first it seems. Commented Feb 23, 2018 at 10:21

1 Answer 1

1

I think you didn't understand how is working connect.
What you did is :
1. connect the first button to a function when retranslateUi is called
2. the function called when you click on the button connects the next button to a new function
3. etc... for all button

So if you click several time in first button (let's say canonicalAddressesButton), it will connect several time the button callLogButton. So call several time the function select_call_data.

So to connect correctly all button you have to connect them ALL in the function retranslateUi and then declare your 4 function to connect after that.

Be aware of identation with python.

So you need to change that :

    # Canonical Addresses Button click functionality to parse canonical address data
    self.canonicalAddressesButton.clicked.connect(self.select_canonical_data)

def select_canonical_data(self):
    os.system('CanonicalAddressesParser.py')

    # Call Logs Button click functionality to parse call log data
    self.callLogButton.clicked.connect(self.select_call_data)

def select_call_data(self):
    os.system('CallLogParser.py')

    # SMS Button click functionality to parse SMS data
    self.smsButton.clicked.connect(self.select_sms_data)

def select_sms_data(self):
    os.system('SmsParser.py')

    # Sim Card Button click functionality to parse sim card data
    self.simCardButton.clicked.connect(self.select_sim_data)

def select_sim_data(self):
    os.system('SimCardParser.py')

by :

    # Canonical Addresses Button click functionality to parse canonical address data
    self.canonicalAddressesButton.clicked.connect(self.select_canonical_data)
    # Sim Card Button click functionality to parse sim card data
    self.simCardButton.clicked.connect(self.select_sim_data)
    # Call Logs Button click functionality to parse call log data
    self.callLogButton.clicked.connect(self.select_call_data)
    # SMS Button click functionality to parse SMS data
    self.smsButton.clicked.connect(self.select_sms_data)

def select_canonical_data(self):
    os.system('CanonicalAddressesParser.py')

def select_call_data(self):
    os.system('CallLogParser.py')

def select_sms_data(self):
    os.system('SmsParser.py')

def select_sim_data(self):
    os.system('SimCardParser.py')
Sign up to request clarification or add additional context in comments.

2 Comments

Thank You I can see what I was doing wrong now. It works perfectly now. I will accept your answer.
great , glad it helps

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.