Tkinter Text Cut/Copy/Paste功能

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() 

输出:

Tkinter Text Cut/Copy/Paste功能

对上述程序而言,最重要的是下列三个方法。下面是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() 

输出:

Tkinter Text Cut/Copy/Paste功能

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程