1 #tkinter:文件系统遍历
2 importtkinter as tk, os3 from time importsleep4
5
6 classDirList(object):7 def __init__(self, initdir=os.curdir):8 self.top =tk.Tk()9 self.top.title('查找')10
11 self.top.geometry('400x500') #设置窗口大小
12 self.label = tk.Label(self.top, text='文件列表', font=('宋体 -16 bold'))13 self.label.pack()14
15 #StringVar:字符串变量,特点是跟踪变量变化,及时显示在界面上
16 self.cwd =tk.StringVar(self.top)17 self.cwd.set(initdir)18
19 #当前目录显示标签
20 self.dirl = tk.Label(self.top, fg='blue', font=('Helvetica -14 bold'))21 self.dirl.pack()22
23 #新建框体容器,存放文件列表和滚动条
24 self.dirfm =tk.Frame(self.top)25 #滚动条
26 self.dirsb =tk.Scrollbar(self.dirfm)27 self.dirsb.pack(side=tk.RIGHT, fill=tk.Y)28 #列表框
29 self.dirs = tk.Listbox(self.dirfm, height=23, width=60,30 font=('Helvetica -14'),31 yscrollcommand=self.dirsb.set)32 #绑定setDirAndGo函数
33 self.dirs.bind('', self.setDirAndGo)34 #滑动框与列表关联
35 self.dirsb.config(command=self.dirs.yview)36 self.dirs.pack(side=tk.LEFT, fill=tk.X)37 self.dirfm.pack(fill=tk.BOTH)38
39 #输入框
40 self.dirn = tk.Entry(self.top, width=60, font=('Helvetica -14'),41 textvariable=self.cwd)42 #监听回车事件,绑定doLS函数,函数必须要有event参数
43 self.dirn.bind('', self.doLS)44 self.dirn.pack(fill=tk.BOTH)45
46 #功能按钮框架包括三个按钮:清除、查询和退出。
47 self.bfm =tk.Frame(self.top)48 self.clr = tk.Button(self.bfm, text='清除', width=6, command=self.clrDir,49 activeforeground='white', activebackground='blue')50 self.ls = tk.Button(self.bfm, text='查询', width=6, command=self.doLS,51 activeforeground='white', activebackground='green')52 self.quit = tk.Button(self.bfm, text='退出', width=6, command=self.top.quit,53 activeforeground='white', activebackground='red')54 self.clr.pack(side=tk.LEFT, fill=tk.BOTH)55 self.ls.pack(side=tk.LEFT, fill=tk.BOTH)56 self.quit.pack(side=tk.LEFT, fill=tk.BOTH)57 self.bfm.pack()58
59 def clrDir(self, ev=None):60 '''清空文件路径输入框'''
61 self.cwd.set('')62
63 def setDirAndGo(self, ev=None):64 '''设置文件路径并查询'''
65 self.last =self.cwd.get()66 #选中项背景默认为红色,后续修改为蓝色
67 self.dirs.config(selectbackground='red')68 #获取文件列表中选择项,没有选则输入框设置为当前目录路径
69 try:70 #获取目录列表中选中的文件名
71 check =self.dirs.get(self.dirs.curselection())72 except:73 print("没有文件或文件错误!")74 return
75
76 if notcheck:77 check =os.curdir78 self.cwd.set(check)79 self.doLS()80
81 def doLS(self, event=''):82 '''
83 查询文件路径84 :param event:输入框回车事件触发参数85 :return:无86 '''
87 error = ''
88 tdir =self.cwd.get()89 if nottdir:90 tdir =os.curdir91
92 #判断输入框中文件是否存在
93 if notos.path.exists(tdir):94 error = tdir + ': no such file!'
95 #若文件存在,再判断是否是目录
96 elif notos.path.isdir(tdir):97 error = tdir + 'is not directory!'
98
99 iferror:100 '''出现错误则提示在输入框内,2秒后还原'''
101 self.dirn.config(fg='red') #输入框提示文字变为红色
102 self.cwd.set(error)103 self.top.update()104 sleep(2)105 if not (hasattr(self, 'last') andself.last):106 '''使用hasattr函数判断对象是否含有last属性或方法'''
107 self.last =os.curdir108 self.cwd.set(self.last)109 self.dirs.config(selectbackground='LightSkyBlue')110 self.dirn.config(fg='black') #输入框文字颜色还原
111 self.top.update()112 return
113
114 self.cwd.set('FETCHING DIRECTORY CONTENTS...')115 self.top.update()116
117 '''目录列表框操作'''
118 self.dirs.delete(0, tk.END) #清空目录列表
119 #self.dirs.insert(tk.END, os.curdir) # 添加当前目录"."
120 self.dirs.insert(tk.END, os.pardir) #添加上级目录".."
121
122 '''获取指定目录下的文件,在列表控件展示'''
123 dirlist =os.listdir(tdir)124 dirlist.sort()125 os.chdir(tdir) #改变目录到指定路径
126 for eachFlie indirlist:127 self.dirs.insert(tk.END, eachFlie)128 self.cwd.set(os.getcwd()) #在输入框中显示当前绝对路径
129 self.dirl.config(text=os.getcwd()) #上方标签显示当前路径
130 self.dirs.config(selectbackground='LightSkyBlue') #选中时背景色为蓝色
131 self.last = self.cwd.get() #记录最后一次路径
132
133
134 defmain():135 DirList('D:\\')136 tk.mainloop()137
138
139 if __name__ == '__main__':140 main()