使用 python 中的 Tkinter 开发记事本
Tkinter 是一个 GUI 库,通过它我们可以创建多个 GUI 应用程序。在这里,我们将使用 tkinter 开发一个类似记事本的文本编辑器。这个记事本将有菜单,我们可以在菜单中创建新文件、打开已有文件、保存文件、编辑、剪切和粘贴,所有功能都在其中。
先决条件
- 已安装 Python。
- 已安装 Tkinter。
注意 :Tkinter 作为 Python 3.x 的标准库出现。
添加菜单项:
我们的记事本将有四个主菜单项:文件、编辑、命令和帮助。我们的文件菜单项将有四个子菜单项——新建、打开、保存和退出。
我们的编辑菜单项将有三个子菜单项——剪切、复制和粘贴。
我们的命令菜单项将有一个子菜单项——About Commands,
而我们的帮助菜单将有一个子菜单项——About notepad
通过使用以下代码,我们将给出这么多菜单项和子菜单项 −
# 打开新文件
self.__thisFileMenu.add_command(label="New",
command=self.__newFile)
# 打开已有文件
self.__thisFileMenu.add_command(label="Open",
command=self.__openFile)
# 保存当前文件
self.__thisFileMenu.add_command(label="Save",
command=self.__saveFile)
# 在对话框中创建一行
self.__thisFileMenu.add_separator()
self.__thisFileMenu.add_command(label="Exit",
command=self.__quitApplication)
self.__thisMenuBar.add_cascade(label="File", menu=self.__thisFileMenu)
# 添加剪切功能
self.__thisEditMenu.add_command(label="Cut",
command=self.__cut)
# 添加复制功能
self.__thisEditMenu.add_command(label="Copy",
command=self.__copy)
# 添加粘贴功能
self.__thisEditMenu.add_command(label="Paste",
command=self.__paste)
# 添加编辑功能
self.__thisMenuBar.add_cascade(label="Edit", menu=self.__thisEditMenu)
# 创建记事本的描述功能
self.__thisHelpMenu.add_command(label="About Notepad",
command=self.__showAbout)
self.__thisCommandMenu.add_command(label = "About Commands", command=self.__showCommand)
self.__thisMenuBar.add_cascade(label="Commands", menu=self.__thisCommandMenu)
self.__thisMenuBar.add_cascade(label="Help", menu=self.__thisHelpMenu)
添加每个菜单项的功能
现在我们已经准备好了菜单项,现在我们将为每个菜单项添加功能。下面是要添加到此记事本中的功能列表(当然您也可以添加许多其他功能)。
- 打开文件
- 新建文件
- 保存文件
- 退出应用程序
- 显示关于
- 显示命令
- 剪切
- 复制
- 粘贴
下面是实现上述功能的代码 −
def __quitApplication(self):
self.__root.destroy()
# exit()
def __showAbout(self):
showinfo("关于Notepad","使用Python制作的简单文本编辑器,类似于记事本")
def __showCommand(self):
showinfo("Notepad","另一个文本编辑器\n版权所有\n使用BSD许可证,您可以使用它'")
def __openFile(self):
self.__file = askopenfilename(defaultextension=".txt", filetypes=[("所有文件", "*.*"), ("文本文档", "*.txt")])
if self.__file == "":
# 没有要打开的文件
self.__file = None
else:
# 尝试打开文件
# 设置窗口标题
self.__root.title(os.path.basename(self.__file) + " - Notepad")
self.__thisTextArea.delete(1.0, END)
file = open(self.__file, "r")
self.__thisTextArea.insert(1.0, file.read())
file.close()
def __newFile(self):
self.__root.title("untitled Notepad")
self.__file = None
self.__thisTextArea.delete(1.0, END)
def __saveFile(self):
if self.__file == None:
# 保存为新文件
self.__file = asksaveasfilename(initialfile='Untitled.txt', defaultextension=".txt", filetypes=[("所有文件", "*.*"), ("文本文档", "*.txt")])
if self.__file == "":
self.__file = None
else:
# 尝试保存文件
file = open(self.__file, "w")
file.write(self.__thisTextArea.get(1.0, END))
file.close()
# 更改窗口标题
self.__root.title(os.path.basename(self.__file) + " - Notepad")
else:
file = open(self.__file, "w")
file.write(self.__thisTextArea.get(1.0, END))
file.close()
def __cut(self):
self.__thisTextArea.event_generate("<<Cut>>")
def __copy(self):
self.__thisTextArea.event_generate("<<Copy>>")
def __paste(self):
self.__thisTextArea.event_generate("<<Paste>>")
现在我们已经添加了所需的程序包,添加了一个菜单项和所需的功能,我们将使用tkinter库创建一个类似于记事本的文本编辑器。
以下是使用tkinter创建记事本文本编辑器的完整程序 –
#Import os library
import os
#import everything from tkinter
from tkinter import *
#To get the space above the message
from tkinter.messagebox import *
#To get the dialog box to open when required
from tkinter.filedialog import *
class Notepad:
# Set up the root widget
__root = Tk()
__thisWidth = 500
__thisHeight = 700
__thisTextArea = Text(__root)
__thisMenuBar = Menu(__root)
__thisFileMenu = Menu(__thisMenuBar, tearoff=0)
__thisEditMenu = Menu(__thisMenuBar, tearoff=0)
__thisHelpMenu = Menu(__thisMenuBar, tearoff=0)
__thisCommandMenu = Menu(__thisMenuBar, tearoff=0)
# To add scrollbar
__thisScrollBar = Scrollbar(__thisTextArea)
__file = None
def __init__(self,**kwargs):
# icon
try:
self.__root.wm_iconbitmap("Notepad.ico")
except:
pass
# Set window size as mentioned above (the default is 300x300)
try:
self.__thisWidth = kwargs['width']
except KeyError:
pass
try:
self.__thisHeight = kwargs['height']
except KeyError:
pass
# the window text
self.__root.title("Untitled-Notepad")
# Center the window
screenWidth = self.__root.winfo_screenwidth()
screenHeight = self.__root.winfo_screenheight()
# For left-alling
left = (screenWidth / 2) - (self.__thisWidth / 2)
# For right-allign
top = (screenHeight / 2) - (self.__thisHeight /2)
# For top and bottom
self.__root.geometry('%dx%d+%d+%d' % (self.__thisWidth, self.__thisHeight, left, top))
# To make the textarea auto resizable
self.__root.grid_rowconfigure(0, weight=1)
self.__root.grid_columnconfigure(0, weight=1)
# Add controls (widget)
self.__thisTextArea.grid(sticky = N + E + S + W)
# To open new file
self.__thisFileMenu.add_command(label="New",
command=self.__newFile)
# To open a already existing file
self.__thisFileMenu.add_command(label="Open",
command=self.__openFile)
# To save current file
self.__thisFileMenu.add_command(label="Save",
command=self.__saveFile)
# To create a line in the dialog
self.__thisFileMenu.add_separator()
self.__thisFileMenu.add_command(label="Exit",
command=self.__quitApplication)
self.__thisMenuBar.add_cascade(label="File", menu=self.__thisFileMenu)
# To give a feature of cut
self.__thisEditMenu.add_command(label="Cut",
command=self.__cut)
# to give a feature of copy
self.__thisEditMenu.add_command(label="Copy",
command=self.__copy)
# To give a feature of paste
self.__thisEditMenu.add_command(label="Paste",
command=self.__paste)
# To give a feature of editing
self.__thisMenuBar.add_cascade(label="Edit", menu=self.__thisEditMenu)
# To create a feature of description of the notepad
self.__thisHelpMenu.add_command(label="About Notepad",
command=self.__showAbout)
self.__thisCommandMenu.add_command(label = "About Commands", command=self.__showCommand)
self.__thisMenuBar.add_cascade(label="Commands", menu=self.__thisCommandMenu)
self.__thisMenuBar.add_cascade(label="Help", menu=self.__thisHelpMenu)
self.__root.config(menu=self.__thisMenuBar)
self.__thisScrollBar.pack(side=RIGHT,fill=Y)
# Scrollbar will adjust automatically according to the content
self.__thisScrollBar.config(command=self.__thisTextArea.yview)
self.__thisTextArea.config(yscrollcommand=self.__thisScrollBar.set)
def __quitApplication(self):
self.__root.destroy()
# exit()
def __showAbout(self):
showinfo("About Notepad","Simple text editor like notepad using Python")
def __showCommand(self):
showinfo("Notepad", "Just Another TextPad \n Copyright \n with BSD license you can use it'")
def __openFile(self):
self.__file = askopenfilename(defaultextension=".txt", filetypes=[("All Files","*.*"),("Text Documents","*.txt")])
if self.__file == "":
# no file to open
self.__file = None
else:
# Try to open the file
# set the window title
self.__root.title(os.path.basename(self.__file) + " - Notepad")
self.__thisTextArea.delete(1.0,END)
file = open(self.__file,"r")
self.__thisTextArea.insert(1.0,file.read())
file.close()
def __newFile(self):
self.__root.title("Untitled Notepad")
self.__file = None
self.__thisTextArea.delete(1.0,END)
def __saveFile(self):
if self.__file == None:
# Save as new file
self.__file = asksaveasfilename(initialfile='Untitled.txt', defaultextension=".txt", filetypes=[("All Files","*.*"), ("Text Documents","*.txt")])
if self.__file == "":
self.__file = None
else:
# Try to save the file
file = open(self.__file,"w")
file.write(self.__thisTextArea.get(1.0,END))
file.close()
# Change the window title
self.__root.title(os.path.basename(self.__file) + " - Notepad")
else:
file = open(self.__file,"w")
file.write(self.__thisTextArea.get(1.0,END))
file.close()
def __cut(self):
self.__thisTextArea.event_generate("<<Cut>>")
def __copy(self):
self.__thisTextArea.event_generate("<<Copy>>")
def __paste(self):
self.__thisTextArea.event_generate("<<Paste>>")
def run(self):
# Run main application
self.__root.mainloop()
# Run main application
notepad = Notepad(width=600,height=400)
notepad.run()
运行上述程序后,我们会得到一个弹出式记事本文本编辑器,类似于
在这个记事本中,我们可以写入内容,保存并打开我们保存的文件(或任何其他文件)。我们可以从打开的文件内容中创建剪切、复制和粘贴操作。您可以使用此新创建的记事本中的所有菜单项。