Pyqt Gui Freezes while in loop

12,369

Solution 1

You should call QtCore.QCoreApplication.processEvents() within your for loop to make the Qt's event loop proceed the incoming event (from keyboard or mouse).

Solution 2

Although calling QtCore.QCoreApplication.processEvents() works now, I have read in many places on the web that it should be a last resort. Unfortunately none of the sources clearly explain why -- but see for example

So it does seem allowed, but in general, it seems to be better design to use QTimer or QThread.

Share:
12,369
user3755771
Author by

user3755771

Updated on June 04, 2022

Comments

  • user3755771
    user3755771 almost 2 years

    Im making port scanner program with PyQt but Gui freezes when i activate loop.How can i fix that? I added time.sleep() function but it still freezes. This is the function it freezes. Thanks.

            try:
                time.sleep(1) 
                hostname=self.adres.text()
                hostip=socket.gethostbyname(hostname)
                uyari1="Scanning remote host, {}\n".format(hostip)
                self.durum.append(uyari1)
                print(uyari1)
                for port in range(1,1025):
                    time.sleep(0.1)  
                    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                    result = sock.connect_ex((hostip, port))
                    if result == 0:
                        time.sleep(0.01) 
                        print ("Port {}: \t Open".format(port))
                        self.durum.append("Port {}: \t Open\n".format(port))
                    sock.close()
    

    Full code:

    import socket,os,time
    from PyQt4 import QtCore, QtGui
    
    try:
        _fromUtf8 = QtCore.QString.fromUtf8
    except AttributeError:
        def _fromUtf8(s):
            return s
    
    try:
        _encoding = QtGui.QApplication.UnicodeUTF8
        def _translate(context, text, disambig):
            return QtGui.QApplication.translate(context, text, disambig, _encoding)
    except AttributeError:
        def _translate(context, text, disambig):
            return QtGui.QApplication.translate(context, text, disambig)
    
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            MainWindow.setObjectName(_fromUtf8("MainWindow"))
            MainWindow.resize(596, 412)
            self.centralwidget = QtGui.QWidget(MainWindow)
            self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
            self.label = QtGui.QLabel(self.centralwidget)
            self.label.setGeometry(QtCore.QRect(120, -10, 331, 91))
            self.label.setObjectName(_fromUtf8("label"))
            self.label_2 = QtGui.QLabel(self.centralwidget)
            self.label_2.setGeometry(QtCore.QRect(10, 90, 91, 16))
            self.label_2.setObjectName(_fromUtf8("label_2"))
            self.adres = QtGui.QLineEdit(self.centralwidget)
            self.adres.setGeometry(QtCore.QRect(100, 90, 371, 22))
            self.adres.setObjectName(_fromUtf8("adres"))
            self.durum = QtGui.QTextEdit(self.centralwidget)
            self.durum.setGeometry(QtCore.QRect(10, 140, 571, 191))
            self.durum.setObjectName(_fromUtf8("durum"))
            self.baslat = QtGui.QPushButton(self.centralwidget)
            self.baslat.setGeometry(QtCore.QRect(480, 90, 101, 21))
            self.baslat.setObjectName(_fromUtf8("baslat"))
            self.dosyaya = QtGui.QPushButton(self.centralwidget)
            self.dosyaya.setGeometry(QtCore.QRect(490, 340, 91, 25))
            self.dosyaya.setObjectName(_fromUtf8("dosyaya"))
            MainWindow.setCentralWidget(self.centralwidget)
            self.menubar = QtGui.QMenuBar(MainWindow)
            self.menubar.setGeometry(QtCore.QRect(0, 0, 596, 21))
            self.menubar.setObjectName(_fromUtf8("menubar"))
            MainWindow.setMenuBar(self.menubar)
            self.hakkindaa = QtGui.QPushButton(self.centralwidget)
            self.hakkindaa.setGeometry(QtCore.QRect(10, 340, 91, 25))
            self.hakkindaa.setObjectName(_fromUtf8("hakkindaa"))
            self.hakkindaa.setText("Hakkında")
            self.statusbar = QtGui.QStatusBar(MainWindow)
            self.statusbar.setObjectName(_fromUtf8("statusbar"))
            MainWindow.setStatusBar(self.statusbar)
            QtCore.QObject.connect(self.hakkindaa, QtCore.SIGNAL(_fromUtf8("clicked()")), self.hakkinda)
            QtCore.QObject.connect(self.dosyaya, QtCore.SIGNAL(_fromUtf8("clicked()")), self.dosyayaya)
            QtCore.QObject.connect(self.baslat, QtCore.SIGNAL(_fromUtf8("clicked()")), self.baslat_btn)
            self.retranslateUi(MainWindow)
            QtCore.QMetaObject.connectSlotsByName(MainWindow)
    
        def hakkinda(self):
            QtGui.QMessageBox.about(None, "About", "Ege Öz 2014")
    
        def baslat_btn(self):
            try:
                time.sleep(1) 
                hostname=self.adres.text()
                hostip=socket.gethostbyname(hostname)
                uyari1="Scanning remote host, {}\n".format(hostip)
                self.durum.append(uyari1)
                print(uyari1)
                for port in range(1,1025):
                    time.sleep(0.1)  
                    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                    result = sock.connect_ex((hostip, port))
                    if result == 0:
                        time.sleep(0.01) 
                        print ("Port {}: \t Open".format(port))
                        self.durum.append("Port {}: \t Open\n".format(port))
                    sock.close()
    
            except socket.gaierror:
                self.durum.append("Hostname could not be resolved.")
                print("Hostname could not be resolved.")
                self.adres.setText("")
            except socket.error:
    
                self.durum.append("Could not connect to server.")
                print("Could not connect to server.")
                self.adres.setText("")
        def dosyayaya(self):
                self.durum.append("Saving log file to home directory...")
                ev=os.getenv("USER")
                data=self.durum.toPlainText()
                yol="/home/"+ev+"/portscanner.log"
                f = open (yol,"w")
                f.write(data)
                f.close()
                self.durum.append("Log file saved.")
                print ("Log file saved.")
        def retranslateUi(self, MainWindow):
            MainWindow.setWindowTitle(_translate("MainWindow", "Port Scanner", None))
            self.label.setText(_translate("MainWindow", "<html><head/><body><p align=\"center\"><span style=\" font-size:11pt; font-weight:600;\">Port Scanner</span></p><p>Enter the remote host adress and press start.</p></body></html>", None))
            self.label_2.setText(_translate("MainWindow", "Remote Host:", None))
            self.baslat.setText(_translate("MainWindow", "Start Scanning", None))
            self.dosyaya.setText(_translate("MainWindow", "Save to file", None))    
    
    if __name__ == "__main__":
        import sys
        app = QtGui.QApplication(sys.argv)
        MainWindow = QtGui.QMainWindow()
        ui = Ui_MainWindow()
        ui.setupUi(MainWindow)
        MainWindow.show()
        sys.exit(app.exec_())