实现菜单和弹出式菜单的各项功能
import tkinter as tk
import tkinter.scrolledtext as tst
class Application(tk.Frame):
def __init__(self,master=None): #构造函数
tk.Frame.__init__(self,master)
self.grid()
self.createWidgets() #声明对象方法,创建子组件
self.createMenu() #声明对象方法,创建菜单
root["menu"]=self.menubar #附加主菜单到根窗口
root.bind("<Button-3>",self.f_popup) #绑定鼠标右击事件
def createWidgets(self):
self.textEdit=tst.ScrolledText(self,width=80,height=20) #创建text组件
self.textEdit.grid(row=0,column=0,rowspan=6)
def createMenu(self):
self.menubar=tk.Menu(root) #创建主菜单menubar
self.menufile=tk.Menu(self.menubar) #创建菜单menufile
self.menuedit=tk.Menu(self.menubar,tearoff=0)
self.menuhelp=tk.Menu(self.menubar,tearoff=0) #创建菜单menuhelp
self.menubar.add_cascade(label="File",menu=self.menufile)
self.menubar.add_cascade(label="Edit",menu=self.menuedit)
self.menubar.add_cascade(label="Help",menu=self.menuhelp)
#添加菜单项
#文件菜单
self.menufile.add_command(label="New",command=self.f_new)
self.menufile.add_command(label="Open",command=self.f_open)
self.menufile.add_command(label="Save",accelerator="^A",command=self.f_save)
self.menufile.add_separator() #分隔符
self.menufile.add_command(label="Exit",command=root.destroy)
#编辑菜单
self.menuedit.add_command(label="Cut",command=self.f_cut)
self.menuedit.add_command(label="Copy",command=self.f_copy)
self.menuedit.add_command(label="Paste",command=self.f_paste)
#帮助菜单
self.menuhelp.add_command(label="About",command=self.f_about)
def f_new(self): #定义新建文件的菜单命令事件处理函数
self.textEdit.delete(1.0,tk.END) #清空text组件内的内容
def f_open(self): #定义打开文件的菜单命令事件处理函数
self.textEdit.delete(1.0,tk.END) #清空Text组件内容
fname=tk.filedialog.askopenfilename(filetypes=[("Python源文件",".py")])
with open(fname,"r",encoding="utf-8") as f1: #打开文件
str1=f1.read() #将文件读入到str1变量中
self.textEdit.insert(0.0,str1) #插入内容到text组件中
def f_save(self):
str1=self.textEdit.get(1.0,tk.END) #获取text组件内的所有内容
fname=tk.filedialog.asksaveasfilename(filetypes=[("Python源文件",".py")])
with open(fname,"w",encoding="utf-8") as f1: #打开文件
f1.write(str1) #将str1中的内容全部写入text组件中
def f_about(self):
tk.messagebox.showinfo("关于","版本V 1.0")
def f_cut(self):
try:
str1=self.textEdit.get(tk.SEL_FIRST,tk.SEL_LAST) #获取选择的内容
self.textEdit.clipboard_clear() #清空剪贴板
self.textEdit.clipboard_append(str1) #将str1中的内容添加到剪贴板中
self.textEdit.delete(tk.SEL_FIRST,tk.SEL_LAST) #删除选择的内容
except:pass
def f_copy(self):
try:
str1=self.textEdit.get(tk.SEL_FIRST,tk.SEL_LAST)
self.textEdit.clipboard_clear()
self.textEdit.clipboard_append(str1)
except:pass
def f_paste(self):
str1=self.textEdit.selection_get(selection="CLIPBOARD") #获取剪贴板内的内容
try:
self.textEdit.replace(tk.SEL_FIRST,tk.SEL_LAST,str1) #使用剪贴板内容替换所选内容,否则插入剪贴板内容
except:
self.textEdit.insert(tk.INSERT,str1) #将内容插到当前位置
def f_popup(self,event): #弹出式菜单事件处理函数
self.menuedit.post(event.x_root,event.y_root) #在鼠标右键位置显示菜单
root=tk.Tk()
root.title("简易文本编辑器")
app=Application(master=root) #创建Application对象实例
app.mainloop() #事件循环
运行结果: