Contents
20.5.2. 整体GUI代码¶
#!/usr/bin/env python
# -*- coding:utf8 -*-
# auther; 18793
# Date:2019/8/9 22:45
# filename: findfat1.py
import tkinter
import tkinter.messagebox, tkinter.simpledialog
import os, os.path
import threading
rubbishExt = ['.tmp', '.bak', '.old', '.wbk', '.chk', '.@@@', '.$$$$']
class Window:
def __init__(self):
self.root = tkinter.Tk()
# 创建菜单
menu = tkinter.Menu(self.root)
# 创建"系统"子菜单
submenu = tkinter.Menu(menu, tearoff=0)
submenu.add_command(label='关于...', command=self.MenuAbout)
submenu.add_separator()
submenu.add_command(label='退出', command=self.MenuExit)
menu.add_cascade(label='系统', menu=submenu)
# 创建"清理"子菜单
submenu = tkinter.Menu(menu, tearoff=0)
submenu.add_command(label='扫描垃圾文件', command=self.MenuScanRubbish)
submenu.add_command(label='删除垃圾文件', command=self.MenuDelRubbish)
menu.add_cascade(label='清理', menu=submenu)
# 创建"查找"子菜单
submenu = tkinter.Menu(menu, tearoff=0)
submenu.add_command(label='搜索大文件', command=self.MenuScanBigFile)
submenu.add_separator()
submenu.add_command(label='按名称搜索文件', command=self.MenuSearchFile)
menu.add_cascade(label='搜索', menu=submenu)
self.root.config(menu=menu)
# 创建标签,用于显示状态信息
self.progress = tkinter.Label(self.root, anchor=tkinter.W, text='状态', bitmap='hourglass', compound='left')
self.progress.place(x=10, y=370, width=480, height=15)
# 创建文本框,显示文件列表
self.flist = tkinter.Text(self.root)
self.flist.place(x=10, y=10, width=480, height=350)
# 为文本框添加垂直滚动条
self.vscroll = tkinter.Scrollbar(self.flist)
self.vscroll.pack(side='right', fill='y')
self.flist['yscrollcommand'] = self.vscroll.set
self.vscroll['command'] = self.flist.yview
def MainLoop(self):
self.root.title('Windows 【减肥】 工具')
self.root.minsize(500, 400)
self.root.maxsize(500, 400)
self.root.mainloop()
def MenuAbout(self):
"""
关于按钮的触发器
:return:
"""
tkinter.messagebox.showinfo("Windows 【减肥工具】",
"这是使用Python编写的Windows优化程序。\n 欢迎使用并提出宝贵的意见!")
def MenuExit(self):
"""
退出按钮的触发器
:return:
"""
self.root.quit()
def MenuScanRubbish(self):
"""
‘扫描垃圾文件’菜单
:return:
"""
result = tkinter.messagebox.askquestion("Windows【减肥工具】",
"扫描垃圾文件将需要较长时间,是否继续?")
if result == 'no':
return
tkinter.messagebox.showinfo("Findfat", "马上开始扫描垃圾文件!")
# self.ScanRubbish()
self.drives = GetDirves()
t = threading.Thread(target=self.ScanRubbish, args=(self.drives,)) # 创建线程
t.start() # 开始线程
def MenuDelRubbish(self):
"""
‘删除垃圾文件’菜单
:return:
"""
result = tkinter.messagebox.askquestion("Windows【减肥工具】",
"删除垃圾文件将需要较长时间,是否继续?")
if result == 'no':
return
tkinter.messagebox.showinfo("Findfat", "马上开始删除垃圾文件!")
# self.DeleteRubbish()
self.drives = GetDirves()
t = threading.Thread(target=self.DeleteRubbish, args=(self.drives,)) # 创建线程
t.start() # 开始线程
def MenuScanBigFile(self):
"""
‘搜索大文件’菜单
:return:
"""
s = tkinter.simpledialog.askinteger('Findfat', '请设置大文件的大小(M)')
t = threading.Thread(target=self.ScanBigFile, args=(s,))
t.start()
# result = tkinter.messagebox.askquestion("Windows【减肥工具】",
# "扫描大文件将需要较长时间,是否继续?")
# if result == 'no':
# return
# tkinter.messagebox.showinfo("Findfat", "马上开始扫描大文件!")
def MenuSearchFile(self):
"""
‘按名称搜索文件’菜单
:return:
"""
s = tkinter.simpledialog.askstring('Findfat', '请输入文件名的部分字符')
t = threading.Thread(target=self.SearchFile, args=(s,))
t.start()
# result = tkinter.messagebox.askquestion("Windows【减肥工具】",
# "按名称搜索文件将需要较长时间,是否继续?")
# if result == 'no':
# return
# tkinter.messagebox.showinfo("Findfat", "马上开始按名称搜索文件!")
def ScanRubbish(self, scanpath):
"""
Scanning 垃圾文件
:return:
"""
global rubbishExt
total = 0
filesize = 0
for drive in scanpath:
for root, dir, files in os.walk(drive):
try:
for fil in files:
filesplit = os.path.splitext(fil)
if filesplit[1] == '': # 若文件无扩展名
continue
try:
if rubbishExt.index(filesplit[1]) >= 0: # 扩展名在垃圾文件扩展名中
fname = os.path.join(os.path.abspath(root), fil)
filesize += os.path.getsize(fname)
if total % 15 == 0:
self.flist.delete(0.0, tkinter.END)
l = len(fname)
if l > 50:
self.progress['text'] = fname[:25] + '....' + fname[l - 25:l]
self.flist.insert(tkinter.END, fname + "\n")
self.progress['text'] = fname
total += 1 # 计数
except ValueError:
pass
except Exception as e:
print(e)
pass
self.progress['text'] = "找到【%s】个垃圾文件,共占用【%.2fM】磁盘空间" % (total, filesize / 1024 / 1024)
def DeleteRubbish(self, scanpath):
"""
Delete垃圾文件
:return:
"""
global rubbishExt
total = 0
filesize = 0
for drive in scanpath:
for root, dir, files in os.walk(drive):
try:
for fil in files:
filesplit = os.path.splitext(fil)
if filesplit[1] == '': # 若文件无扩展名
continue
try:
if rubbishExt.index(filesplit[1]) >= 0: # 扩展名在垃圾文件扩展名中
fname = os.path.join(os.path.abspath(root), fil)
filesize += os.path.getsize(fname)
try:
os.remove(fname) # 删除文件
l = len(fname)
if l > 50:
self.progress['text'] = fname[:25] + '....' + fname[l - 25:l]
if total % 15 == 0:
self.flist.delete(0.0, tkinter.END)
self.flist.insert(tkinter.END, fname + "\n")
self.progress['text'] = fname
total += 1 # 计数
except:
pass
except ValueError:
pass
except Exception as e:
print(e)
pass
self.progress['text'] = "删除 【%s】个垃圾文件,回收 【%.2fM】磁盘空间" % (total, filesize / 1024 / 1024)
def ScanBigFile(self, filesize):
"""
寻找大文件
:param filesize:
:return:
"""
total = 0
filesize = filesize * 1024 * 1024
for drive in GetDirves():
for root, dirs, files in os.walk(drive):
for fil in files:
try:
fname = os.path.abspath(os.path.join(root, fil))
fsize = os.path.getsize(fname)
self.progress['text'] = fname # 在状态标签中显示每一个遍历的文件
if fsize >= filesize:
total += 1
self.flist.insert(tkinter.END, '%s, [%.2f M]\n' % (fname, fsize / 1024 / 1024))
except:
pass
self.progress['text'] = "找到 【%s】个超过【%s】M的大文件" % (total, filesize / 1024 / 1024)
def SearchFile(self, fname):
"""
寻找大文件
:param filesize:
:return:
"""
total = 0
fname = str(fname).upper()
for drive in GetDirves():
for root, dirs, files in os.walk(drive):
for fil in files:
try:
fn = os.path.abspath(os.path.join(root, fil))
l = len(fn)
if l > 50:
self.progress['text'] = fn[:25] + '...' + fn[l - 25:l]
else:
self.progress['text'] = fn
if fil.upper().find(fname) >= 0:
total += 1
self.flist.insert(tkinter.END, fn + '\n')
except:
pass
self.progress['text'] = "找到%s个文件" % (total)
def GetDirves():
"""
扫描本地所有磁盘,将C盘排除
:return:
"""
dirves = []
for i in range(65, 91):
vol = chr(i) + ":/"
if os.path.isdir(vol):
dirves.append(vol)
index = dirves.index("C:/")
# list1.pop(index)
del dirves[index]
return tuple(dirves)
if __name__ == '__main__':
window = Window()
window.MainLoop()
# GetDirves()