Python Pyqt Gui在循环中冻结

Python Pyqt Gui在循环中冻结,python,pyqt,pyqt4,Python,Pyqt,Pyqt4,我正在用PyQt制作端口扫描程序,但当我激活循环时Gui会冻结。我如何修复这个问题?我添加了time.sleep()函数,但它仍然冻结。这是它冻结的功能。谢谢 try: time.sleep(1) hostname=self.adres.text() hostip=socket.gethostbyname(hostname) uyari1="Scanning remote host,

我正在用PyQt制作端口扫描程序,但当我激活循环时Gui会冻结。我如何修复这个问题?我添加了time.sleep()函数,但它仍然冻结。这是它冻结的功能。谢谢

        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()
完整代码:

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_())
导入套接字、操作系统、时间
从PyQt4导入QtCore、QtGui
尝试:
_fromUtf8=QtCore.QString.fromUtf8
除属性错误外:
来自UTF8的def_:
返回s
尝试:
_编码=QtGui.QApplication.UnicodeUTF8
定义翻译(上下文、文本、消歧):
返回QtGui.QApplication.translate(上下文、文本、消歧、_编码)
除属性错误外:
定义翻译(上下文、文本、消歧):
返回QtGui.QApplication.translate(上下文、文本、消歧)
类Ui_主窗口(对象):
def设置UI(自我,主窗口):
MainWindow.setObjectName(_fromUtf8(“MainWindow”))
主窗口。调整大小(596412)
self.centralwidget=QtGui.QWidget(主窗口)
self.centralwidget.setObjectName(\u fromUtf8(“centralwidget”))
self.label=QtGui.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(120,-10331,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)
自我地址设置几何(QtCore.QRect(100,90371,22))
self.adres.setObjectName(_fromUtf8(“adres”))
self.durum=QtGui.QTextEdit(self.centralwidget)
自硬粒刚毛几何学(QtCore.QRect(10140571191))
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)
setGeometry(QtCore.QRect(49034019125))
self.dosyaya.setObjectName(_fromUtf8(“dosyaya”))
MainWindow.setCentralWidget(self.centralwidget)
self.menubar=QtGui.QMenuBar(主窗口)
self.menubar.setGeometry(QtCore.QRect(0,0596,21))
self.menubar.setObjectName(_fromUtf8(“menubar”))
MainWindow.setMenuBar(self.menubar)
self.hakkindaa=QtGui.QPushButton(self.centralwidget)
self.hakindaa.setGeometry(QtCore.QRect(103409125))
self.hakkindaa.setObjectName(_fromUtf8(“hakkindaa”))
self.hakkindaa.setText(“Hakkında”)
self.statusbar=QtGui.QStatusBar(主窗口)
self.statusbar.setObjectName(_fromUtf8(“statusbar”))
main window.setStatusBar(self.statusbar)
QtCore.QObject.connect(self.hakkindaa,QtCore.SIGNAL(_fromUtf8(“clicked()”),self.hakkinda)
QtCore.QObject.connect(self.dosyaya,QtCore.SIGNAL(_fromUtf8(“clicked()”),self.dosyaya)
QtCore.QObject.connect(self.baslat,QtCore.SIGNAL(_fromUtf8(“clicked()”),self.baslat\u btn)
自重传(主窗口)
QtCore.QMetaObject.connectSlotsByName(主窗口)
哈金达(自我):
QtGui.QMessageBox.about(无,“about”,“EgeÖz 2014”)
def baslat_btn(自身):
尝试:
时间。睡眠(1)
hostname=self.adres.text()
hostip=socket.gethostbyname(主机名)
uyari1=“正在扫描远程主机,{}\n”。格式(主机IP)
自身硬粒附加(uyari1)
打印(uyari1)
对于范围内的端口(11025):
睡眠时间(0.1)
sock=socket.socket(socket.AF\u INET,socket.sock\u流)
结果=sock.connect_ex((主机IP,端口))
如果结果==0:
睡眠时间(0.01)
打印(“端口{}:\t打开”。格式(端口))
self.durum.append(“端口{}:\t Open\n.format(端口))
sock.close()
除socket.gai错误外:
self.durum.append(“无法解析主机名”)
打印(“无法解析主机名”)
self.adres.setText(“”)
除socket.error外:
self.durum.append(“无法连接到服务器”)
打印(“无法连接到服务器。”)
self.adres.setText(“”)
def dosyayaya(自我):
self.durum.append(“将日志文件保存到主目录…”)
ev=os.getenv(“用户”)
data=self.durum.toPlainText()
yol=“/home/”+ev+”/portscanner.log”
f=开放(约尔,“w”)
f、 写入(数据)
f、 关闭()
self.durum.append(“已保存日志文件”)
打印(“已保存日志文件”)
def重新传输(自身,主窗口):
setWindowTitle(_translate(“主窗口”,“端口扫描程序”,无))
self.label.setText(\u translate(“主窗口”,端口扫描器“

”,无)) self.label_2.setText(_translate(“主窗口”,“远程主机:”,无)) self.baslat.setText(_translate(“主窗口”,“开始扫描”,无)) self.dosyaya.setText(_translate(“主窗口”,“保存到文件”,无)) 如果名称=“\uuuuu main\uuuuuuuu”: 导入系统 app=QtGui.QApplication(sys.argv) MainWindow=QtGui.QMainWindow() ui=ui\u主窗口() ui.setupUi(主窗口) MainWindow.show() sys.exit(app.exec_())


您应该在for循环中调用
QtCore.QCoreApplication.processEvents()
,使Qt的事件循环继续处理传入的事件(通过键盘或鼠标)。

尽管调用
QtCore.QCoreApplication.processEvents()
现在起作用,但我在网络上的许多地方都读到,这应该是最后的手段。不幸的是,没有一个来源能清楚地解释原因——但请参见示例

因此,这似乎是允许的,但一般来说,使用
QTimer
QThread