import tkinter as tk
from tkinter import ttk, messagebox
import paramiko
from scp import SCPClient
import time
import threading
class SCPTransferApp:
def init(self, root):
self.root = root
self.root.title("SCP文件传输工具(从远程到本地)By:小栗")
# 初始化传输相关变量
self.start_time = None
self.last_update_time = None
self.last_bytes = 0
self.total_size = 0
self.transferred_size = 0
self.stop_transfer = False
self.ssh = None
self.scp = None
self.transfer_thread = None
# 控件布局
self.create_widgets()
def create_widgets(self):
# 本地路径
tk.Label(self.root, text="本地路径:").grid(row=0, column=0, padx=10, pady=5)
self.local_path = tk.Entry(self.root, width=50)
self.local_path.grid(row=0, column=1, padx=10, pady=5)
# 远程主机
tk.Label(self.root, text="远程主机:").grid(row=1, column=0, padx=10, pady=5)
self.remote_host = tk.Entry(self.root, width=50)
self.remote_host.grid(row=1, column=1, padx=10, pady=5)
# 远程用户
tk.Label(self.root, text="远程用户:").grid(row=2, column=0, padx=10, pady=5)
self.remote_user = tk.Entry(self.root, width=50)
self.remote_user.grid(row=2, column=1, padx=10, pady=5)
# 远程密码
tk.Label(self.root, text="远程密码:").grid(row=3, column=0, padx=10, pady=5)
self.remote_password = tk.Entry(self.root, width=50, show="*")
self.remote_password.grid(row=3, column=1, padx=10, pady=5)
# 远程路径
tk.Label(self.root, text="远程路径:").grid(row=4, column=0, padx=10, pady=5)
self.remote_path = tk.Entry(self.root, width=50)
self.remote_path.grid(row=4, column=1, padx=10, pady=5)
# 进度条
self.progress = ttk.Progressbar(self.root, orient="horizontal", length=400, mode='determinate')
self.progress.grid(row=5, column=0, columnspan=2, pady=5)
# 传输信息显示
self.transferred_label = tk.Label(self.root, text="已传输: 0 B / 0 B")
self.transferred_label.grid(row=6, column=0, columnspan=2)
self.speed_label = tk.Label(self.root, text="速度: 0 B/s")
self.speed_label.grid(row=7, column=0, columnspan=2)
self.time_label = tk.Label(self.root, text="剩余时间: --")
self.time_label.grid(row=8, column=0, columnspan=2)
# 按钮框架
button_frame = tk.Frame(self.root)
button_frame.grid(row=9, column=0, columnspan=2, pady=10)
# 传输按钮
self.transfer_button = tk.Button(button_frame, text="下载文件", command=self.start_transfer)
self.transfer_button.pack(side=tk.LEFT, padx=10)
# 取消按钮
self.cancel_button = tk.Button(button_frame, text="取消传输", command=self.cancel_transfer, state=tk.DISABLED)
self.cancel_button.pack(side=tk.LEFT, padx=10)
# 清空按钮
self.clear_button = tk.Button(button_frame, text="清空信息", command=self.clear_fields)
self.clear_button.pack(side=tk.LEFT, padx=10)