Tkinter Text Cut/Copy/Paste功能
编辑文件时剪切/复制/粘贴(Cut/Copy/Paste)是很常用的功能,这些功能其实已经被内建在tkinter中了,不过在使用这些内建功能前,作者还是想为读者建立正确概念,学习更多基本功,毕竟学会基本功可以了解工作原理,对读者而言将会更有帮助。如果我们想要删除所编辑的文件可以用delete( )方法,在这个方法中如果想要删除的是一个字符,可以使用一个参数,这个参数可以是索引,下面是一个实例。
delete(INSERT) #删除插入点字符
如果要删除所选的文本块,可以使用两个参数:起始索引与结束索引。
delete(SEL_FIrST, SEL_LAST) # 删除所选文本块
delete(startindex, endindex) # 删除指定区域文本块
在编辑程序时常常会需要删除整份文件,可以使用下列语法。
delete(1.0, END)
注意:以上皆需要由Text对象启动。接下来将直接用程序实例讲解如何应用这些功能。
示例1
使用tkinter设计具有Cut/Copy/Paste功能的弹出菜单,这个菜单可以执行剪切/复制/粘贴(Cut/Copy/Paste)工作。
from tkinter import *
from tkinter import messagebox
def cutJob(): # Cut方法
print("Cut operation in progress...")
copyJob() # 复制选取文字
text.delete(SEL_FIRST,SEL_LAST) # 删除选取文字
def copyJob():
print("Copy operation in process...")
try:
text.clipboard_clear()
copyText = text.get(SEL_FIRST,SEL_LAST)
text.clipboard_append(copyText)
except TclError:
print("Not selected...")
def pasteJob():
print("Paste operation is in progress...")
try:
copyText = text.selection_get(selection="CLIPBOARD")
text.insert(INSERT,copyText)
except TclError:
print("No data on the clipboard")
def showPopupMenu(event):
print("Show pop-up menu...")
popupmenu.post(event.x_root,event.y_root)
root = Tk()
root.title("apidemos.com")
root.geometry("300x180")
popupmenu = Menu(root,tearoff=False)
# 在弹出菜单内建立三个命令列表
popupmenu.add_command(label="Cut",command=cutJob)
popupmenu.add_command(label="Copy",command=copyJob)
popupmenu.add_command(label="Paste",command=pasteJob)
# 单击鼠标右键绑定显示弹出菜单
root.bind("<Button-3>",showPopupMenu)
# 建立Text
text = Text(root)
text.pack(fill=BOTH,expand=True,padx=3,pady=2)
text.insert(END,"Five Hundred Miles\n") # 插入时同时设置Tag
text.insert(END,"If you miss the rain I'm on,\n")
text.insert(END,"You will know that I am gone.\n")
text.insert(END,"You can hear the whistle blow\n")
text.insert(END,"A hundred miles,\n")
root.mainloop()
输出:
对上述程序而言,最重要的是下列三个方法。下面是cutJob( )方法。
def cutJob(): # Cut方法
copyJob() # 复制选取文字
text.delete(SEL_FIRST, SEL_LAST) # 删除选取文字
在编辑功能中执行cut命令时,数据是暂存在剪贴板上的,所以第5行先执行copyJob( ),这个方法会将所选取的文字区间储存在剪贴板。第6行则是删除所选取的文字区间。下列是copyJob( )方法。
def copyJob(): # Copy方法
try:
text.clipboard_clear() # 清除剪贴板
copyText = text.get(SEL_FIRST, SEL_LAST) # 复制选取区域
text.clipboard_append(copyText) # 写入剪贴板
except TclError:
print("Not selected.")
复制是将所选取的数据先复制至剪贴板,为了单纯化,在第9行使用clipboard_clear( )方法先删除剪贴板的数据。由于如果没有选取文字就读取所选区块文字会造成异常,所以程序中增加try…except设计。第10行是将所选取的文本块读入copyText变量。第11行则是使用clipboard_append( )方法将参数copyText变量的内容写入剪贴板。下面是pasteJob( )方法的设计。
def pasteJob(): # paste方法
try:
copyText = text.selection_get(selection="CLIPBOARD") # 读取剪贴板内容
text.insert(INSERT, copyText) # 插入内容
except TclError:
print("No data on the clipboard")
如果剪贴板没有数据在执行读取时会产生TclError异常,所以设计时增加了try…except设计。第16行调用selection_get( )方法读取剪贴板中的内容,所读取的内容会存储在copyText,第17行则是将所读取的copyText内容插入编辑区INSERT位置。
不过上述Cut/Copy/Paste方法目前已经内建为tkinter的虚拟事件,可以直接引用,可参考下列方法。
示例2
使用内建的虚拟方法
from tkinter import *
from tkinter import messagebox
def cutJob(): # Cut方法
print("Cut operation in progress...")
text.event_generate("<<Cut>>")
def copyJob():
print("Copy operation in process...")
text.event_generate("<<Copy>>")
def pasteJob():
print("Paste operation is in progress...")
text.event_generate("<<Paste>>")
def showPopupMenu(event):
print("Show pop-up menu...")
popupmenu.post(event.x_root,event.y_root)
root = Tk()
root.title("apidemos.com")
root.geometry("300x180")
popupmenu = Menu(root,tearoff=False)
# 在弹出菜单内建立三个命令列表
popupmenu.add_command(label="Cut",command=cutJob)
popupmenu.add_command(label="Copy",command=copyJob)
popupmenu.add_command(label="Paste",command=pasteJob)
# 单击鼠标右键绑定显示弹出菜单
root.bind("<Button-3>",showPopupMenu)
# 建立Text
text = Text(root)
text.pack(fill=BOTH,expand=True,padx=3,pady=2)
text.insert(END,"Five Hundred Miles\n") # 插入时同时设置Tag
text.insert(END,"If you miss the rain I'm on,\n")
text.insert(END,"You will know that I am gone.\n")
text.insert(END,"You can hear the whistle blow\n")
text.insert(END,"A hundred miles,\n")
root.mainloop()
输出: