github地址:https://github.com/yangsphp/file-manager-mask
一、效果图
二、功能描述
1、打开文件菜单中的打开按钮,可以选择目录。
2、可以查看各种类型的图片。
3、可以编辑文本。
4、显示行号功能,可改变目录显示的宽度。
三、使用的标签
1、Menu
2、Frame
3、PanedWindow
4、Treeview
5、Text
6、Scrollbar
四、布局代码
# -*- coding: utf-8 -*- __author__ = 'Yang' from tkinter import * from tkinter import ttk, messagebox, filedialog import os from PIL import Image, ImageTk from threading import Thread class Application_UI(object): # path = r"E:\\python开发工具\\project\\tkinter" path = os.path.abspath(".") file_types = [".png", ".jpg", ".jpeg", ".ico", ".gif"] scroll_visiblity = True font = 11 font_type = "Courier New" def __init__(self): # 设置UI界面 window = Tk() self.root = window win_width = 800 win_height = 600 screen_width, screen_height = window.maxsize() x = int((screen_width - win_width) / 2) y = int((screen_height - win_height) / 2) window.title("文件管理工具") window.geometry("%sx%s+%s+%s" % (win_width, win_height, x, y)) menu = Menu(window) window.config(menu = menu) selct_path = Menu(menu, tearoff = 0) selct_path.add_command(label = "打开", accelerator="Ctrl + O", command = self.open_dir) selct_path.add_command(label = "保存", accelerator="Ctrl + S", command = self.save_file) menu.add_cascade(label = "文件", menu = selct_path) about = Menu(menu, tearoff = 0) about.add_command(label = "版本", accelerator = "v1.0.0") about.add_command(label = "作者", accelerator = "样子") menu.add_cascade(label = "关于", menu = about) # 顶部frame top_frame = Frame(window, bg = "#fff") top_frame.pack(side = TOP, fill = X) label = Label(top_frame, text = "当前选中路径:", bg = "#fff") label.pack(side = LEFT) self.path_var = StringVar() self.path_var.set("无") label_path = Label(top_frame, textvariable = self.path_var, bg = "#fff", fg = "red", height = 2) label_path.pack(anchor = W) paned_window = PanedWindow(window, showhandle = False, orient=HORIZONTAL) paned_window.pack(expand = 1, fill = BOTH) # 左侧frame self.left_frame = Frame(paned_window) paned_window.add(self.left_frame) self.tree = ttk.Treeview(self.left_frame, show = "tree", selectmode = "browse") tree_y_scroll_bar = Scrollbar(self.left_frame, command = self.tree.yview, relief = SUNKEN, width = 2) tree_y_scroll_bar.pack(side = RIGHT, fill = Y) self.tree.config(yscrollcommand = tree_y_scroll_bar.set) self.tree.pack(expand = 1, fill = BOTH) # 右侧frame right_frame = Frame(paned_window) paned_window.add(right_frame) # 右上角frame right_top_frame = Frame(right_frame) right_top_frame.pack(expand = 1, fill = BOTH) self.number_line = Text(right_top_frame, width = 0, takefocus = 0, border = 0, font = (self.font_type, self.font), cursor = "") self.number_line.pack(side = LEFT, fill = Y) # 右上角Text text = Text(right_top_frame, font = (self.font_type, self.font), state = DISABLED, cursor = "", wrap = NONE) self.text_obj = text text_x_scroll = Scrollbar(right_frame, command = text.xview, orient = HORIZONTAL) text_y_scroll = Scrollbar(right_top_frame, command = text.yview) self.text_scroll_obj = text_y_scroll text.config(xscrollcommand = text_x_scroll.set, yscrollcommand = text_y_scroll.set) text_y_scroll.pack(side = RIGHT, fill = Y) text_x_scroll.pack(side = BOTTOM, fill = X) text.pack(expand = 1, fill = BOTH) # 右下角frame right_bottom_frame = Frame(right_frame) right_bottom_frame.pack(side = BOTTOM, fill = X) self.folder_img = PhotoImage(file = r"./image/folder.png") self.file_img = PhotoImage(file = r"./image/text_file.png") php_img = PhotoImage(file = r"./image/php.png") python_img = PhotoImage(file = r"./image/python.png") image_img = PhotoImage(file = r"./image/img.png") # 设置文件图标 self.icon = {".php": php_img, ".py": python_img, ".pyc": python_img, ".png": image_img, ".jpg": image_img, ".jpeg": image_img, ".gif": image_img, ".ico": image_img} # 加载目录文件 self.load_tree("", self.path) self.tree.bind("<<TreeviewSelect>>", lambda event: self.select_tree()) text.bind("<MouseWheel>", lambda event : self.update_line()) self.number_line.bind("<FocusIn>", self.focus_in_event) self.number_line.bind('<Button-1>', self.button_ignore) self.number_line.bind('<Button-2>', self.button_ignore) self.number_line.bind('<Button-3>', self.button_ignore) self.number_line.bind('<B1-Motion>', self.button_ignore) self.number_line.bind('<B2-Motion>', self.button_ignore) self.number_line.bind('<B3-Motion>', self.button_ignore) self.text_scroll_obj.bind('<B1-Motion>', lambda event: self.update_line()) self.text_obj.bind('<KeyRelease>', lambda event: self.update_line()) text.bind("<Control-Key-s>", lambda event: self.save_file()) text.bind("<Control-Key-S>", lambda event: self.save_file()) text.bind("<Control-Key-Z>", lambda event: self.toUndo()) text.bind("<Control-Key-Y>", lambda event: self.toRedo()) window.mainloop()