网站建设ppt下载,html编辑器的使用方法,怎么利用网站开发app,芜湖网站设计公司文章目录 简介文件夹对话框文件映射组件完整组件 简介
我们的目的是做一个像下面这样的工具#xff0c;前面两个输入框#xff0c;用于输入源路径和目标路径#xff0c;下面的图片、视频、音乐表示在目标路径中创建的文件夹#xff0c;后面的文件后缀#xff0c;表示将这… 文章目录 简介文件夹对话框文件映射组件完整组件 简介
我们的目的是做一个像下面这样的工具前面两个输入框用于输入源路径和目标路径下面的图片、视频、音乐表示在目标路径中创建的文件夹后面的文件后缀表示将这类文件移动到对应的文件夹中加减号可以新增或删除文件夹。 文件夹对话框
第一步实现源路径和目标路径的输入输出从而需要自定义一个组件代码如下其及具体实现逻辑可以参考自定义文件选择按钮
import tkinter as tk
import tkinter.ttk as ttk
from tkinter.filedialog import (askopenfilename,askopenfilenames, askdirectory, asksaveasfilename)
from tkinter.colorchooser import askcolorclass DialogButton(ttk.Frame):def __init__(self, master, height, widthL, widthR, logtype, labelNone, textNone, frmDct{}, btnDct{}, enyDct{}, logDct{}):w widthL widthRsuper().__init__(master, heightheight, width w, **frmDct)self.pack(filltk.X)self.text tk.StringVar() if not text else textttk.Entry(self, widthwidthL, textvariableself.text, **enyDct).pack(sidetk.LEFT, fill tk.X, expandTrue)ttk.Button(self, widthwidthR, textself.setLabel(logtype, label),command self.Click, **btnDct).pack(sidetk.RIGHT, padx5)self.logtype logtypeself.logDct logDctdef setLabel(self, key, labelNone):if label:return labellabelDct {文件 : 选择文件,文件夹 : 选择路径,多文件 : 选择多个文件,保存 : 存储路径,颜色 : 选择颜色,}return labelDct[key]def Click(self):typeDct {文件 : askopenfilename,文件夹: askdirectory,多文件: askopenfilenames,保存 : asksaveasfilename,颜色 : askcolor,}text typeDct[self.logtype](**self.logDct)if self.logtype 颜色:text text[1]self.text.set(text)def get(self):return self.text.get()def set(self, txt):self.text.set(txt)文件映射组件
关于文件夹整理这个功能此前其实做过无图形界面的版本 Python整理下载文件夹第一步自然是做一个文件映射字典
F_DCT {图片 : [.jpg, .png, .jpeg, .gif],视频 : [.mp4, .mkv],音乐 : [.mp3, .wav],文档 : [.pdf], 文献 : [.caj],文本 : [.csv, .txt],源码 : [.py, .c, .cpp, .php],office: [.docx,.xlsx, .pptx, .doc, .ppt, .xls],压缩包: [.zip, .tgz, .rar, .tar, .7z, .gz],安装包: [.msi, .exe],
}然后就是工具的核心内容文件映射组件主要由左右两部分组成左侧是文件夹名右侧是对应的文件后缀。从这两个子组件出发可以为其设置初始化参数以及方法。先看源码再逐段解析
import tkinter as tk
import tkinter.ttk as ttk
from ctrls import DialogButton
import os
import shutil
pJoin os.path.join
pExist os.path.existsfrom pathlib import Pathclass ExFolder(ttk.Frame):def __init__(self, master, folderNone, exNone, dstNone, **options):super().__init__(master, **options)self.pack()self.folder tk.StringVar()if folder : self.setFolder(folder)self.ex tk.StringVar()if ex : self.setEx(ex)self.setDst(dst)self.initWidgets()def initWidgets(self):ttk.Entry(self, textvariableself.folder, width10).pack(sidetk.LEFT, padx2) ttk.Entry(self, textvariableself.ex).pack(sidetk.LEFT, filltk.X, expandTrue)def getFolder(self):return self.folder.get()def setFolder(self, f):self.folder.set(f)def getEx(self):exs self.ex.get().split(,)for i in range(len(exs)):exs[i] exs[i].strip()return exsdef setEx(self, exs):if type(exs)list:exs , .join([ex.strip() for ex in exs])self.ex.set(exs)def mvFile(self, src):try:shutil.move(src, self.dst)except Exception as e:self.err print(e)# 设置目标文件夹def setDst(self, dst):if not dst:self.dst Nonereturnself.dst pJoin(dst, self.getFolder())if not pExist(self.dst):os.makedirs(self.dst)self.errs {}首先folder和ex分别是左右两个组件对应的可变文本为了便于更新和调用类中设计了两组、四对便携方法getFolder, setFolder和getEx和setEx。由于Folder中的内容就是文件夹本身所以设置和读取方法仅仅是StringVar的二次封装而ex中的内容则不然需要对文本进行分割并且实现字符串到列表的转换。
mvFile和setDst是组件的核心功能分别用于设置目标路径并移动。之所以为目标文件夹设置安排了一个独立方法是因为目标文件夹不一定存在可能涉及到递归创建的过程。
完整组件
最后是整个组件的布局源码如下其中撤销功能并未实现。
class FolderTools(ttk.Frame):def __init__(self, master, fDctF_DCT, **options):super().__init__(master, **options)self.pack()self.fDct fDctself.initWidgets()self.fEnys []self.exEnys []def setDct(self, fDct):self.fDct fDctself.exDct {}for k,v in self.fDct.items():exDct.update({ex:k for ex in v})def initWidgets(self):self.exForders []pDct dict(sidetk.TOP, expandTrue, filltk.X)self.srcFolder DialogButton(self, 5, 25, 8, 文件夹, label源路径)self.srcFolder.pack(**pDct)self.dstFolder DialogButton(self, 5, 25, 8, 文件夹, label目标路径)self.dstFolder.pack(**pDct)btns ttk.Frame(self)btns.pack(**pDct)ttk.Button(btns, text➕ , commandself.btnAddFolder).grid(row0,column0)ttk.Button(btns, text➖, commandself.btnDelFolder).grid(row0,column1)ttk.Button(btns, text移动, commandself.btnMove).grid(row0,column2)ttk.Button(btns, text撤销, commandself.btnMove).grid(row0,column3)self.exFrm ttk.LabelFrame(self, text文件夹映射表)self.exFrm.pack(**pDct)for k, v in self.fDct.items():self.addFolders(self.exFrm, k, v)def btnAddFolder(self):self.addFolders(self.exFrm, None, None)def addFolders(self, frm, folder, exs):ef ExFolder(frm, folder, exs)ef.pack(sidetk.TOP, expandTrue, filltk.X, padx2, pady1)self.exForders.append(ef)def btnDelFolder(self):if len(self.exForders) 0: returnself.exForders[-1].pack_forget()del self.exForders[-1]def setExDct(self):self.exDct {}for ef in self.exForders:self.exDct.update({key:ef for key in ef.getEx()})def btnMove(self):src self.srcFolder.get()dst self.dstFolder.get()if dst: dst src# 设置后缀映射字典 exExFolderexDct {}for ef in self.exForders:exDct.update({ex:ef for ex in ef.getEx()})ef.setDst(dst) # 设置目标文件夹files os.listdir(src)for f in files:p pJoin(src, f)ex Path(p).suffix.lower()if ex in exDct:exDct[ex].mvFile(p)三个已经实现的功能按钮➕用于新增一个文件夹映射组件➖则移除最后一个映射组件。移除组件时需要注意不仅仅要把组件解绑还要把组件对应的实例删掉。
核心功能被绑定在移动按钮上首先读取源路径和目标路径如果目标路径未输入就在源路径下工作。
接下来将文件映射组件重新拆解为映射字典最后调用对应组件的mvFile方法实现所有文件的移动。