本文代码即注释。(完整代码附后)
关于这个简易记事本的实现,gui界面采用python的tkinter库
下面展示总体的功能区的方法实现。
读到这里,应该对该记事本的主要功能以及代码实现过程有一个粗略的认识。
该程序各个功能都独立成了方法,降低了代码耦合度,方便维护与修改。
下面是完整代码以及代码的详细注释:
# -*- coding: utf-8 -*-
# @Author:︶ㄣ释然
# @Time: 2022/7/6 21:41
import tkinter as tk
from tkinter import filedialog
from tkinter import messagebox
import os
filename_initStr = ''
# 菜单栏——1、文件——①新建
def new_file():
# 关于三个全局变量:
# top = tk.Tk()
# filename_initStr = ''
# text_more_lines = tk.Text(top, padx=5, pady=5)
global top, filename_initStr, text_more_lines
top.title("未命名文件")
# 若"新建",则内容为空
filename_initStr = None
text_more_lines.delete(1.0, tk.END)
# 菜单栏——1、文件——②打开
def open_file():
global filename_initStr
# 此处filename_initStr接收到的是txt文件的绝对路径
filename_initStr = filedialog.askopenfilename(defaultextension=".txt")
if filename_initStr == "":
filename_initStr = None
else:
# 路径不为空,则可以打开
top.title("" + os.path.basename(filename_initStr))
text_more_lines.delete(1.0, tk.END)
file = open(filename_initStr, 'r', encoding="utf-8")
# 将读到的文件的内容,利用insert方法,插进主页面进行显示
text_more_lines.insert(1.0, file.read())
file.close() # 关闭文件
# 菜单栏——1、文件——③保存
def save():
try:
open_File = open(filename_initStr, 'w', encoding="utf-8")
msg = text_more_lines.get(1.0, 'end')
open_File.write(msg)
open_File.close()
except:
# 如果open_File保存不成功,说明不存在该文件,首先则应该跳转到另存为
save_additionally()
# 菜单栏——1、文件——④另存为
def save_additionally():
try:
# filedialog主要实现文件对话框
# initialfile初始化新文件名字,defaultextension设置文件格式
NewFile = filedialog.asksaveasfilename(initialfile="未命名", defaultextension=".txt")
create_new_file = open(NewFile, 'w', encoding="utf-8")
msg = text_more_lines.get(1.0, tk.END) # 获取多行文本框的全部内容
create_new_file.write(msg) # 写入文件
create_new_file.close()
top.title("" + os.path.basename(NewFile))
except:
# 利用try-expect解决在点击另存为后,直接关闭对话框的操作引起的程序报错
pass
# 菜单栏——2、编辑——①复制
def copy():
text_more_lines.event_generate("<<Copy>>")
# 菜单栏——2、编辑——②粘贴
def paste():
text_more_lines.event_generate("<<Paste>>")
# 菜单栏——2、编辑——③剪切
def cut():
text_more_lines.event_generate("<<Cut>>")
# 菜单栏——2、编辑——④全选
def select_all():
text_more_lines.tag_add("sel", "1.0", "end") # 选择第一个到最后一个
# 菜单栏——3、关于——①关于
def program_createTime():
messagebox.showinfo(title="程序创建时间", message="2022-6-21")
# 菜单栏——3、关于—②版权
def Author():
messagebox.showinfo(title="版权信息", message="作者:\n许梓璘\n2109059342")
# gui界面
if __name__ == '__main__':
top = tk.Tk()
top.title("记事本")
top.geometry("1000x500")
# 顶层菜单栏
top_menu_Bar = tk.Menu(top)
# 定义"文件"菜单
file_of_menu = tk.Menu(top)
file_of_menu.add_command(label="新建", accelerator="Ctrl+N", command=new_file) # 绑定new_file()函数
file_of_menu.add_command(label="打开", accelerator="Ctrl+O", command=open_file) # 绑定open_file()函数
file_of_menu.add_command(label="保存", accelerator="Ctrl+S", command=save) # 绑定save()函数
file_of_menu.add_command(label="另存为", accelerator="Ctrl+shift+s", command=save_additionally) # 绑定new_file()函数
# 绑定top_menuBar中父菜单"文件"的子菜单file_of_menu
top_menu_Bar.add_cascade(label="文件", menu=file_of_menu)
# 定义"编辑"菜单
edit_of_menu = tk.Menu(top)
edit_of_menu.add_command(label="复制", accelerator="Ctrl+C", command=copy)
edit_of_menu.add_command(label="粘贴", accelerator="Ctrl+V", command=paste)
edit_of_menu.add_command(label="剪切", accelerator="Ctrl+X", command=cut)
# 添加一条分隔符
edit_of_menu.add_separator()
edit_of_menu.add_command(label="全选", accelerator="Ctrl+A", command=select_all)
# 绑定top_menuBar中父菜单"编辑"的子菜单edit_of_menu
top_menu_Bar.add_cascade(label="编辑", menu=edit_of_menu)
# 定义"关于"菜单
about_of_menu = tk.Menu(top)
about_of_menu.add_command(label="关于", command=program_createTime)
about_of_menu.add_command(label="版权", command=Author)
# 绑定top_menuBar中父菜单"关于"的子菜单about_of_menu
top_menu_Bar.add_cascade(label="关于", menu=about_of_menu)
# 最后使用窗口的menu属性指定使用menuBar作为顶层菜单
top['menu'] = top_menu_Bar
# 设置多行的文本框
# tk.Text(父对象, padx, pady)
# padx=5表示Text左/右框与文字最左/最右的间距为5,pady=5表示Text上/下框与文字最上/最下的间距为5
text_more_lines = tk.Text(top, padx=5, pady=5)
# expand指定是否填充父组件的额外空间,默认值是False
# fill指定填充pack分配的空间,默认值是NONE,表示保持子组件的原始尺寸,这里使用的是"both"(水平和垂直填充)
text_more_lines.pack(expand=True, fill=tk.BOTH)
# 滚动条
scroll = tk.Scrollbar(master=text_more_lines) # 作用的父组件为定义的text_more_lines多行文本框
# 决定滚动条滑块位置的方法是set(),
# 列表框需要跟滚动条相联动,即需要绑定滚动条
text_more_lines.config(yscrollcommand=scroll.set) # yscrollcommand调用垂直滚动条的set()方法
# 滚动条跟列表框相联动
scroll.config(command=text_more_lines.yview) # 垂直滚动条参数command调用列表框的yview()方法
scroll.pack(side=tk.RIGHT, fill=tk.Y) # 设置滚动条的位置
# 有关热键绑定(在程序中,绑定了Ctrl + 对应字母的大小写,
# 即一个热键作了两次绑定)
# text_more_lines为多行文本框
# 新建
text_more_lines.bind("<Control-N>", new_file)
text_more_lines.bind("<Control-n>", new_file)
# 打开
text_more_lines.bind("<Control-O>", open_file)
text_more_lines.bind("<Control-o>", open_file)
# 保存
text_more_lines.bind("<Control-S>", save)
text_more_lines.bind("<Control-s>", save)
# 另存为
text_more_lines.bind("<Control-Shift-s>", save_additionally)
text_more_lines.bind("<Control-Shift-S>", save_additionally)
# 复制
text_more_lines.bind("<Control-c>", copy)
text_more_lines.bind("<Control-C>", copy)
# 粘贴
text_more_lines.bind("<Control-v>", paste)
text_more_lines.bind("<Control-V>", paste)
# 剪切
text_more_lines.bind("<Control-x>", cut)
text_more_lines.bind("<Control-X>", cut)
# 全选
text_more_lines.bind("<Control-A>", select_all)
text_more_lines.bind("<Control-a>", select_all)
top.mainloop()