测试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)
【以下回答由 GPT 生成】
我可以为您提供一个使用多线程测试多个IP连接FTP并在界面上显示连接结果的解决方案。具体步骤如下:
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, "失败")
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) # 启动线程
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)
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连接,并在界面上显示连接结果和重连时间的解决方案。但是请注意,以上代码只是一个示例,具体的实现方式可能还需要根据您的具体情况进行调整。
【相关推荐】