Tkinter文件管理器调用shutil移动文件时误移动整个文件夹问题求助
问题原因
- 缩进逻辑错误:
for循环、时间判断、路径拼接的代码没有正确缩进,仅循环执行了源文件路径拼接操作,判断逻辑和移动操作都在循环外执行 - 变量定义顺序错误:代码中先使用了
dst变量拼接目标路径,后才弹出选择框获取目标文件夹路径,会触发变量未定义报错 - 移动参数错误:
shutil.move传入的参数是整个源文件夹路径src,而非符合时间要求的单个文件路径,因此会直接移动整个源文件夹 - 路径判断遗漏:没有判断遍历到的路径是文件还是文件夹,默认会把符合时间要求的子文件夹也一同移动
修正后完整代码
from tkinter import * import shutil import time import os from tkinter import filedialog root = Tk() root.title('File Manager') root.geometry("300x250") # 如果需要提前选择源文件夹复用,可以打开下面的注释,调整move_to逻辑 src_path = "" def select_folder(): global src_path src_path = filedialog.askdirectory(title="选择源文件夹") def move_to(): # 选择源文件夹,如果你提前用Select Folder按钮选了源,可以把下面两行替换为 src = src_path src = filedialog.askdirectory(title="选择源文件夹") if not src: # 处理用户取消选择的情况 return # 先选择目标文件夹,避免后续变量未定义报错 dst = filedialog.askdirectory(title="选择目标文件夹") if not dst: return SECONDS_IN_DAY = 24 * 60 * 60 now = time.time() before = now - SECONDS_IN_DAY def last_mod_time(fname): return os.path.getmtime(fname) for fname in os.listdir(src): src_fname = os.path.join(src, fname) # 只移动文件,跳过子文件夹,不需要可以删除这行判断 if not os.path.isfile(src_fname): continue if last_mod_time(src_fname) > before: dst_fname = os.path.join(dst, fname) shutil.move(src_fname, dst_fname) def file_check(): folderList = filedialog.askdirectory() if not folderList: return sortlist = sorted(os.listdir(folderList)) print("Files in ", folderList, "folder are:") for filename in sortlist: print(filename+'\n') select_button = Button(root, text="Select Folder", command= select_folder) select_button.pack(pady=20) move_button = Button(root, text="Move To Folder", command= move_to) move_button.pack(pady=22) check_button = Button(root, text="File Check", command= file_check) check_button.pack(pady=24) root.mainloop()
内容的提问来源于stack exchange,提问作者girlcode
相关产品推荐
相关产品推荐

