关于测试ip是否能ftp,目前遇到的问题是打开界面会卡!(关键词-多线程)

测试ip是否能ftp,目前遇到的问题是打开界面会卡,因为ip太多了。怎么做到多线程又能改变图标的值呢?每个ip还有重连时间,比如十分钟后重新尝试连接


        if len(list)<1:
            return
        else:
            count_container = 1
            for i in range(row):
                try:
                    con = ftplib.FTP(timeout=3.5)
                    con.connect(configParser[list[i]]["ftpip"], int(configParser[list[i]]["ftpport"]))
                    con.login(configParser[list[i]]["ftpusername"], configParser[list[i]]["ftppassword"])
                    print("成功")
                    count_container = 1
                except:
                    print("失败")
                    count_container = 2


                btn = QPushButton(self)
                btn.setText(configParser[list[i]]["ftpname"])
                btn.setFlat(True)  # 透明背景

                #根据返回值改变图标
                if count_container == 1:
                    btn.setStyleSheet("QPushButton{background-image: url(img/OK.ico);"
                                       "background-position: bottom;"
                                       "background-repeat: no-repeat;"
                                       "text-align: top;"
                                       "font-size: 12px;"
                                       "padding-top:2px;"
                                      "font-family:Microsoft Yahei;}")
                elif count_container == 2:
                    btn.setStyleSheet("QPushButton{background-image: url(img/NG.ico);"
                                      "background-position: bottom;"
                                      "background-repeat: no-repeat;"
                                      "text-align: top;"
                                      "font-size: 12px;"
                                      "padding-top:2px;"
                                      "font-family:Microsoft Yahei;}")
                self.tableWidget.setCellWidget(0, i, btn)

img

【以下回答由 GPT 生成】

我可以为您提供一个使用多线程测试多个IP连接FTP并在界面上显示连接结果的解决方案。具体步骤如下:

  1. 首先,我们可以创建一个Thread类的子类,用于处理每个IP的连接测试。在这个类中,我们可以定义一个run方法,用于执行连接测试的逻辑。在run方法中,我们可以使用ftplib.FTP库进行FTP连接测试,并根据连接结果设置连接状态变量。
import ftplib
from PyQt5.QtCore import QThread, pyqtSignal

class FtpThread(QThread):
    update_signal = pyqtSignal(str, str)  # 定义一个信号,用于更新界面连接状态

    def __init__(self, ip, port, username, password, ftp_name):
        super().__init__()
        self.ip = ip
        self.port = port
        self.username = username
        self.password = password
        self.ftp_name = ftp_name

    def run(self):
        try:
            con = ftplib.FTP(timeout=3.5)
            con.connect(self.ip, self.port)
            con.login(self.username, self.password)
            self.update_signal.emit(self.ftp_name, "成功")
        except:
            self.update_signal.emit(self.ftp_name, "失败")
  1. 然后,我们需要根据多个IP创建多个FtpThread对象,并将它们加入到线程池中执行。我们可以使用QThreadPool类来管理线程池。
from PyQt5.QtCore import QThreadPool

threadpool = QThreadPool()
for i in range(len(list)):
    ip = configParser[list[i]]["ftpip"]
    port = int(configParser[list[i]]["ftpport"])
    username = configParser[list[i]]["ftpusername"]
    password = configParser[list[i]]["ftppassword"]
    ftp_name = configParser[list[i]]["ftpname"]

    thread = FtpThread(ip, port, username, password, ftp_name)
    thread.update_signal.connect(self.update_connection_status)  # 连接信号与界面更新槽函数
    threadpool.start(thread)  # 启动线程
  1. 在界面类中,我们可以定义一个槽函数update_connection_status,用于接收连接状态变量并更新界面上的连接状态显示。
def update_connection_status(self, ftp_name, status):
    btn = QPushButton(self)
    btn.setText(ftp_name)
    btn.setFlat(True)  # 透明背景

    if status == "成功":
        btn.setStyleSheet("QPushButton{background-image: url(img/OK.ico);"
                           "background-position: bottom;"
                           "background-repeat: no-repeat;"
                           "text-align: top;"
                           "font-size: 12px;"
                           "padding-top:2px;"
                           "font-family:Microsoft Yahei;}")
    elif status == "失败":
        btn.setStyleSheet("QPushButton{background-image: url(img/NG.ico);"
                          "background-position: bottom;"
                          "background-repeat: no-repeat;"
                          "text-align: top;"
                          "font-size: 12px;"
                          "padding-top:2px;"
                          "font-family:Microsoft Yahei;}")
    self.tableWidget.setCellWidget(0, i, btn)
  1. 最后,我们可以使用QTimer来定时触发重试连接。在界面类的初始化方法中,创建一个QTimer对象,并设置定时器触发后的槽函数为重新连接方法。
from PyQt5.QtCore import QTimer

self.reconnect_timer = QTimer()
self.reconnect_timer.timeout.connect(self.reconnect)
self.reconnect_timer.start(600000)  # 每隔10分钟触发一次重新连接

def reconnect(self):
    # 重新连接逻辑
    ...

这样,我们就实现了使用多线程测试多个IP是否能够进行FTP连接,并在界面上显示连接结果和重连时间的解决方案。但是请注意,以上代码只是一个示例,具体的实现方式可能还需要根据您的具体情况进行调整。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^