自学内容网 自学内容网

AI 绘制的不错的 ftp 客户端

class LogWindow(QDialog):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("Upgrade Progress")
        self.resize(500, 350)

        # 设置样式表美化界面
        self.setStyleSheet("""
            QDialog {
                background-color: #f2f2f2;
                border-radius: 10px;
            }
            QPlainTextEdit {
                background-color: #1e1e1e;
                color: #dcdcdc;
                border-radius: 5px;
                padding: 10px;
                font-family: Consolas, monospace;
                font-size: 14px;
            }
            QPushButton {
                background-color: #4caf50;
                color: white;
                border-radius: 5px;
                padding: 8px 15px;
                font-size: 14px;
            }
            QPushButton:hover {
                background-color: #45a049;
            }
        """)

        # 布局
        main_layout = QVBoxLayout()

        # 添加日志显示窗口
        self.log_edit = QPlainTextEdit(self)
        self.log_edit.setReadOnly(True)
        main_layout.addWidget(self.log_edit)

        # 底部的关闭按钮
        self.close_button = QPushButton("Close", self)
        self.close_button.clicked.connect(self.close)

        # 添加按钮布局
        button_layout = QHBoxLayout()
        button_layout.addStretch(1)  # 左侧扩展
        button_layout.addWidget(self.close_button)  # 右侧关闭按钮
        main_layout.addLayout(button_layout)

        self.setLayout(main_layout)

    def append_log(self, text):
        self.log_edit.appendPlainText(text)
        self.log_edit.verticalScrollBar().setValue(self.log_edit.verticalScrollBar().maximum())

这个窗口不错

import sys
import ftplib
import shutil

from datetime import datetime

from PySide6.QtWidgets import (
    QApplication, QWidget, QVBoxLayout, QHBoxLayout, QLabel,
    QLineEdit, QPushButton, QProgressBar, QMessageBox, QFrame, QFileDialog, QComboBox, QPlainTextEdit, QDialog,
)
from db import Sqlite3Database
from PySide6.QtGui import QIcon, QFont
from PySide6.QtCore import QThread, Signal,Qt
import os

class LogWindow(QDialog):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("Upgrade Log")
        self.resize(400, 300)

        # 设置布局
        layout = QVBoxLayout()

        # 添加日志显示窗口
        self.log_edit = QPlainTextEdit(self)
        self.log_edit.setReadOnly(True)
        layout.addWidget(self.log_edit)

        self.setLayout(layout)

    def append_log(self, text):
        self.log_edit.appendPlainText(text)

class FTPDownloadThread(QThread):
    progress = Signal(int)
    finished = Signal(bool)
    progressMsg = Signal(str)

    def __init__(self, host, username, password, file_path, save_path):
        super().__init__()
        self.host = host
        self.username = username
        self.password = password
        self.file_path = file_path
        self.save_path = save_path

    def run(self):
        try:
            ftp = ftplib.FTP(self.host)
            ftp.login(self.username, self.password)
            total_size = ftp.size(self.file_path)

            with open(self.save_path, 'wb') as f:
                def handle_block(block):
                    f.write(block)
                    self.progress.emit(int(f.tell() / total_size * 100))
                ftp.retrbinary(f"RETR {self.file_path}", handle_block)

            ftp.quit()
            self.finished.emit(True)
        except Exception as e:
            print(f"Error: {e}")
            self.finished.emit(False)


class FTPUploadThread(QThread):
    progress = Signal(int)
    finished = Signal(bool)
    progressMsg = Signal(str)

    def __init__(self, host: str, username: str, password: str, remotePath: str, save_path: str):
        super().__init__()
        self.host = host
        self.username = username
        self.password = password
        self.file_path = remotePath
        self.save_path = save_path

    def run(self):
        try:
            ftp = ftplib.FTP(self.host)
            ftp.login(self.username, self.password)
            for dirpath, dirnames, filenames in os.walk(self.save_path):
                for filename in filenames:
                    total_size = os.path.getsize(dirpath + "/" + filename)
                    self.progressMsg.emit(f"{dirpath + "/" + filename}")
                    if filename.find(".db") != -1:
                        self.progressMsg.emit(f"{dirpath}/{filename} 复写数据库开始")
                        newDB = Sqlite3Database(dirpath + "/" + filename)
                        with open(filename, 'wb') as f:
                            def handle_block(block):
                                 f.write(block)
                            ftp.retrbinary(f"RETR /mnt/flash/config/{filename}", callback=handle_block)
                        oldDB = Sqlite3Database(filename)
                        oldTb = ()
                        newTb = ()
                        if filename == "drurmu.db":
                            oldTb = oldDB.readData("rmu")
                            newTb = newDB.readData("rmu")
                        elif filename == "drurau.db":
                            oldTb = oldDB.readData("rru")
                            newTb = newDB.readData("rru")

                        self.progressMsg.emit(f"{dirpath}/{filename} 复写数据库完成")
                        dbk =  filename + "." + datetime.now().strftime("%Y%m%d%H%M%S")
                        self.progressMsg.emit(f"备份数据库名称: {dbk}")
                        shutil.copy(filename, dbk)

                    with open(f"{dirpath + "/" + filename}", 'rb') as f:
                        track_length = 0
                        def handle_block(block):
                            nonlocal track_length
                            track_length = track_length + len(block)
                            self.progress.emit((track_length / total_size) * 100)
                        ftp.storbinary(f"STOR {self.file_path + "/" + filename}", f, callback=handle_block)
            ftp.quit()
            self.finished.emit(True)
        except Exception as e:
            self.progressMsg.emit(f"Error: {e}")
            self.finished.emit(False)


def progress_bar_style():
    return """
        QProgressBar {
            border: 1px solid #007BFF;  /* 简单的边框 */
            border-radius: 0;  /* 去掉圆角 */
            text-align: center;
        }
        QProgressBar::chunk {
            background-color: #007BFF;  /* 进度条填充色 */
        }
    """


def button_style():
    return """
        QPushButton {
            background-color: #007BFF;  /* 按钮背景色 */
            color: white;  /* 按钮文字颜色 */
            font-size: 16px;
            padding: 8px;  /* 按钮内边距 */
            border: none;  /* 去掉边框 */
        }
        QPushButton:hover {
            background-color: #0056b3;  /* 鼠标悬停时的背景色 */
        }
    """


def input_style():
    return """
        QLineEdit {
            border: 1px solid gray;  /* 简单的边框 */
            border-radius: 0;  /* 去掉圆角 */
            padding: 5px;
            font-size: 14px;
        }
        QLineEdit:focus {
            border-color: #007BFF;  /* 聚焦时的边框颜色 */
        }
    """
def combobox_style():
    return """
            QComboBox {
                font-size: 14px;
                padding: 5px;
                border: 2px solid #007BFF;
                border-radius: 5px;
                background-color: white;
            }
            QComboBox QAbstractItemView {
                border: 1px solid #007BFF;
                background-color: #f9f9f9;
                selection-background-color: #007BFF;
                selection-color: white;
            }
            QComboBox::drop-down {
                subcontrol-origin: padding;
                subcontrol-position: top right;
                width: 30px;
                border-left-width: 1px;
                border-left-color: #007BFF;
                border-left-style: solid;
                border-top-right-radius: 5px;
                border-bottom-right-radius: 5px;
                background-color: #007BFF;
            }
        """

class FTPUpgradeWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.downloadThread = None
        self.upgrade_button = None
        self.progress_bar = None
        self.rollback_button = None
        self.browse_button = None
        self.file_input = None
        self.password_input = None
        self.user_input = None
        self.host_input = None
        self.uploadThread = None
        self.log_window = LogWindow()
        self.log_window.setWindowModality(Qt.WindowModality.NonModal)
        self.log_window.setMaximumSize(800,600)
        self.log_window.setMinimumSize(800,600)
        self.init_ui()

    def init_ui(self):
        self.setWindowTitle('FTP Upgrade')
        self.setWindowIcon(QIcon('ftp_icon.png'))

        layout = QVBoxLayout()

        frame = QFrame(self)
        frame.setFrameShape(QFrame.NoFrame)  # 不使用边框
        frame_layout = QVBoxLayout()

        self.host_input = QComboBox(self)
        self.host_input.addItems(["近端机 AU ftp://192.168.1.2", "远端机器 RU ftp://192.168.98.98","测试机器 ftp://localhost"])
        self.host_input.setPlaceholderText('Hostname (ftp://hostname)')
        self.host_input.setStyleSheet(combobox_style())
        self.host_input.setEditable(True)

        self.user_input = QLineEdit(self)
        self.user_input.setPlaceholderText('Username')
        self.user_input.setStyleSheet(input_style())

        self.user_input.setText("root")

        self.password_input = QLineEdit(self)
        self.password_input.setPlaceholderText('Password')
        self.password_input.setEchoMode(QLineEdit.Password)  # 隐藏密码输入
        self.password_input.setStyleSheet(input_style())

        self.password_input.setText("root")

        self.file_input = QLineEdit(self)
        self.file_input.setPlaceholderText('File Path (dir)')
        self.file_input.setStyleSheet(input_style())

        # 文件选择按钮
        self.browse_button = QPushButton('Browse...', self)
        self.browse_button.setStyleSheet(button_style())
        self.browse_button.clicked.connect(self.browse_file)

        self.progress_bar = QProgressBar(self)
        self.progress_bar.setValue(0)
        self.progress_bar.setStyleSheet(progress_bar_style())

        self.upgrade_button = QPushButton('Start Upgrade', self)
        self.upgrade_button.setStyleSheet(button_style())
        self.upgrade_button.clicked.connect(self.start_upgrade)

        self.rollback_button = QPushButton('Rollback', self)
        self.rollback_button.setStyleSheet(button_style())
        self.rollback_button.clicked.connect(self.rollback)
        self.rollback_button.setEnabled(False)  # 初始禁用

        button_layout = QHBoxLayout()
        button_layout.addWidget(self.upgrade_button)
        button_layout.addWidget(self.rollback_button)

        frame_layout.addWidget(QLabel('Enter FTP Details:'))
        frame_layout.addWidget(self.host_input)
        frame_layout.addWidget(self.user_input)
        frame_layout.addWidget(self.password_input)
        frame_layout.addWidget(self.file_input)
        frame_layout.addWidget(self.browse_button)  # 添加浏览按钮
        frame_layout.addWidget(self.progress_bar)
        frame_layout.addLayout(button_layout)

        frame.setLayout(frame_layout)

        layout.addWidget(frame)
        self.setLayout(layout)
        self.setMaximumSize(400, 300)
        self.setMinimumSize(400, 300)
        font = QFont("Arial", 10)
        self.setFont(font)

    def browse_file(self):
        dirName = QFileDialog.getExistingDirectory(self, "Select Dir", "")
        if dirName:
            self.file_input.setText(dirName)  # 设置选择的文件路径

    def start_upgrade(self):
        try:
            host = self.host_input.currentText().strip().split('://')[1]
            username = self.user_input.text().strip()
            password = self.password_input.text().strip()
            file_path = self.file_input.text().strip()
        except Exception as e:
            QMessageBox.warning(self, 'Input Error', 'Please enter valid FTP details! {}'.format(e))
            return

        main_window_rect = self.geometry()
        log_window_x = main_window_rect.x() + main_window_rect.width() + 10  # 在主窗口右侧10像素
        log_window_y = main_window_rect.y()
        self.log_window.move(log_window_x, log_window_y)
        self.log_window.show()
        self.rollback_button.setEnabled(True)
        self.upgrade_button.setEnabled(False)
        self.uploadThread = FTPUploadThread(host, username, password, "/", file_path)  # 你可以选择保存路径
        self.uploadThread.progress.connect(self.progress_bar.setValue)
        self.uploadThread.finished.connect(self.on_upgrade_finished)
        self.uploadThread.progressMsg.connect(self.log)
        self.uploadThread.start()

    def log(self,msg:str):
        self.log_window.append_log(msg)

    def rollback(self):
        try:
            host = self.host_input.currentText().strip().split('://')[1]
            username = self.user_input.text().strip()
            password = self.password_input.text().strip()
            file_path = self.file_input.text().strip()
        except Exception as e:
            QMessageBox.warning(self, 'Input Error', 'Please enter valid FTP details! {}'.format(e))
            return

        main_window_rect = self.geometry()
        log_window_x = main_window_rect.x() + main_window_rect.width() + 10  # 在主窗口右侧10像素
        log_window_y = main_window_rect.y()
        self.log_window.move(log_window_x, log_window_y)
        self.log_window.show()
        self.rollback_button.setEnabled(False)
        self.upgrade_button.setEnabled(True)
        self.downloadThread = FTPDownloadThread(host, username, password, "/", file_path)  # 你可以选择保存路径
        self.downloadThread.progress.connect(self.progress_bar.setValue)
        self.downloadThread.finished.connect(self.on_upgrade_finished)
        self.downloadThread.progressMsg.connect(self.log)
        self.downloadThread.start()

    def on_upgrade_finished(self, success):
        if success:
            QMessageBox.information(self, 'Upgrade Complete', 'File has been upgrade successfully.')
        else:
            QMessageBox.critical(self, 'Upgrade Failed', 'An error occurred during the upgrade process.')
        self.upgrade_button.setEnabled(True)
        self.progress_bar.setValue(0)
        self.log_window.close()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = FTPUpgradeWindow()
    window.show()
    sys.exit(app.exec())

大部分代码 AI 完成,写的比较烦了

在这里插入图片描述

多鞭策AI


原文地址:https://blog.csdn.net/weixin_45647912/article/details/142794470

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!