【做一个简单的文件搜索项目】
一、geometry()函数的用法:
通过geometry('wxh±x±y')进行设置。w为宽度,h为高度。 +×表示距屏幕左边的距离;-×表示距屏幕右边的距离;+y 表示距屏幕上边的距离;-y表示距屏幕下边的距离。
import tkinter as tk #桌面应用程序开发 tkinter库
root = tk.Tk() #创建窗口
root.title('搜索工具') #显示标题
root.geometry('600x300') #设置窗体大小 (注意不是乘号 * )
# root.geometry('600x300+200+300')
root.mainloop() #显示窗口
二、设置窗口的:标签、输入框、按钮和列表
#标签Label和输入框Entry pack()布局到页面
tk.Label(root,text='关键字:').pack()
tk.Entry(root).pack()
tk.Label(root,text='文件类型:').pack()
tk.Entry(root).pack()
#按钮Button pack()布局到页面
tk.Button(root,text='搜索').pack()
#列表 pack()布局到页面
tk.Listbox(root).pack()
注意:默认显示是从上到下(针对整个窗体root);
调整目的:1、将标签、输入框、按钮 调整在同一行(从左到右);search_frame组件下面的归为是一个整体(组)。2、列表适应窗口大小
#从左到右布局
search_frame=tk.Frame() #布局组件
search_frame.pack()
tk.Label(search_frame,text='关键字:').pack(side='left') #side位置
tk.Entry(search_frame).pack(side='left')
tk.Label(search_frame,text='文件类型:').pack(side='left')
tk.Entry(search_frame).pack(side=tk.LEFT) #或者使用side=tk.LEFT
tk.Button(search_frame,text='搜索').pack(side='left')
#从上到下布局
tk.Listbox(root).pack(fill=tk.BOTH,expand=True) #铺满窗口
效果如图:
三、搭建框架
目的:点击按钮,获取两个输入框的内容; get()获取
#padx=10,pady=10 分别设置x和y方向的边框 (更美观)
tk.Label(search_frame,text='关键字:').pack(side='left',padx=10,pady=10) #side位置
search_key=tk.Entry(search_frame) #创建对象,以便后面调用
search_key.pack(side='left',padx=10,pady=10)
tk.Label(search_frame,text='文件类型:').pack(side='left',padx=10,pady=10)
search_type=tk.Entry(search_frame) #创建对象,以便后面调用
search_type.pack(side='left',padx=10,pady=10)
#按钮(创建对象,以便后面调用)
search_button=tk.Button(search_frame,text='搜索')
search_button.pack(side='left',padx=10,pady=10)
def search_get():
print('点击了一下按钮',search_key.get(),search_type.get())
#点击按钮,获取输入框Entry的内容,调用文件管理器搜索文件
search_button.config(command=search_get) #按钮点击事件
完善自定义的search_get()函数:对关键字和类型文件进行判断,检索到我们需要的文件;
def search_get():
_key=search_key.get()
_type=search_type.get()
print('按钮被点击了')
#没输入内容,弹窗提示错误
if not _key :
messagebox.showinfo('出错提醒','请输入关键字!')
elif not _type :
messagebox.showinfo('出错提醒','请输入文件类型!')
else:
fn=filedialog.askdirectory() #获取文件夹目录
# print(fn)
fn_list=os.walk(fn) #遍历文件夹目录的所有文件
for root_path,dirs,files in fn_list: #获取根目录、次级目录、所有文件列表
# print(root_path,dirs,files )
for file in files: #遍历所有文件
if file.endswith(_type): #指定类型的文件如果存在则返回True
if _key in file: #判断搜索的关键字是否存在文件
# print(root_path+'\\'+ file)
lst_box.insert(tk.END,root_path+'\\'+ file) #加入到列表中显示
目的:双击列表后显示文件的内容
def lst_box_click(event):
# print('列表盒子被点击了')
#获取被选中的内容
index = lst_box.curselection()[0]
path=lst_box.get(index) #获取文件路径
#显示到新的窗口
top = tk.Toplevel()
top.title('查看内容')
content = open(path,mode='r',encoding='utf-8').read()
text=tk.Text(top)
text.pack()
text.insert(tk.END,content)
完整代码:
import tkinter as tk #桌面应用程序开发 tkinter库
from tkinter import messagebox,filedialog #弹窗和文件框
import os #文件操作
root = tk.Tk() #创建窗口
root.title('搜索工具') #显示标题
root.geometry('600x300') #设置窗体大小 (注意不是乘号 * )
#从左到右布局
search_frame=tk.Frame() #布局组件
search_frame.pack()
#padx=10,pady=10 分别设置x和y方向的边框 (更美观)
tk.Label(search_frame,text='关键字:').pack(side='left',padx=10,pady=10) #side位置
search_key=tk.Entry(search_frame) #创建对象,以便后面调用
search_key.pack(side='left',padx=10,pady=10)
tk.Label(search_frame,text='文件类型:').pack(side='left',padx=10,pady=10)
search_type=tk.Entry(search_frame) #创建对象,以便后面调用
search_type.pack(side='left',padx=10,pady=10)
#按钮(创建对象,以便后面调用)
search_button=tk.Button(search_frame,text='搜索')
search_button.pack(side='left',padx=10,pady=10)
#从上到下布局
lst_box = tk.Listbox(root)
#创建滚动窗口并布局到页面上
sb = tk.Scrollbar(root)
sb.pack(side=tk.RIGHT,fill=tk.Y)
lst_box.config(yscrollcommand=sb.set)
sb.config(command=lst_box.yview)
lst_box.pack(fill=tk.BOTH,expand=True) #铺满窗口
def search_get():
_key=search_key.get()
_type=search_type.get()
# print('按钮被点击了')
#没输入内容,弹窗提示错误
if not _key :
messagebox.showinfo('出错提醒','请输入关键字!')
elif not _type :
messagebox.showinfo('出错提醒','请输入文件类型!')
else:
fn=filedialog.askdirectory() #获取文件夹目录
# print(fn)
fn_list=os.walk(fn) #遍历文件夹目录的所有文件
for root_path,dirs,files in fn_list: #获取根目录、次级目录、所有文件列表
# print(root_path,dirs,files )
for file in files: #遍历所有文件
if file.endswith(_type): #指定类型的文件如果存在则返回True
if _key in file: #判断搜索的关键字是否存在文件
# print(root_path+'\\'+ file)
lst_box.insert(tk.END,root_path+'\\'+ file) #加入到列表中显示
#点击按钮,获取输入框Entry的内容,调用文件管理器搜索文件
search_button.config(command=search_get) #按钮点击事件
def lst_box_click(event):
# print('列表盒子被点击了')
#获取被选中的内容
index = lst_box.curselection()[0]
path=lst_box.get(index) #获取文件路径
#显示到新的窗口
top = tk.Toplevel()
top.title('查看内容')
content = open(path,mode='r',encoding='utf-8').read()
text=tk.Text(top)
text.pack()
text.insert(tk.END,content)
#当列表盒子被双击时,弹出新的窗口
lst_box.bind('<Double-Button-1>',lst_box_click)
root.mainloop() #显示窗口
补充:tkinter控件
Tkinter 公开的几何管理类:包、网格、位置。
Lable控件标签控件
Button控件
用法如下:Entry(根对象, [属性列表]),即Entry(root, option...)
Checkbutton控件Checkbutton 是复选框,又称为多选按钮,可以表示两种状态。用法为: Checkbutton( root, option, ... ), 其中可选属性 option 有很多,如下表所示:
以下是这个小工具的常用方法:
Radiobutton控件
单选按钮是一种可在多个预先定义的选项中选择出一项的 Tkinter 控件
Menu控件
Menu被用来创建一个菜单 Menu(root,option,…)
特有函数如下:
Message控件
Message 控件用来展示一些文字短消息