Python Tkinter 实现文本框右键复制粘贴功能
可以使用 tkinter 库自带的 menu 和 clipboard 模块来实现复制粘贴功能。以下是示例代码:
import tkinter as tk
import tkinter.messagebox as messagebox
import tkinter.scrolledtext as scrolledtext
import tkinter.constants as constants
import tkinter.filedialog as filedialog
import tkinter.simpledialog as simpledialog
import tkinter.font as font
import tkinter.colorchooser as colorchooser
import tkinter.ttk as ttk
import tkinter.clipboard as clipboard
class TextEditor:
def __init__(self, root):
self.root = root
self.root.title('Text Editor')
self.create_widgets()
def create_widgets(self):
# create menu
menu = tk.Menu(self.root)
self.root.config(menu=menu)
file_menu = tk.Menu(menu, tearoff=0)
file_menu.add_command(label='New', command=self.new_file)
file_menu.add_command(label='Open...', command=self.open_file)
file_menu.add_command(label='Save', command=self.save_file)
file_menu.add_command(label='Save As...', command=self.save_as_file)
file_menu.add_separator()
file_menu.add_command(label='Exit', command=self.exit)
menu.add_cascade(label='File', menu=file_menu)
edit_menu = tk.Menu(menu, tearoff=0)
edit_menu.add_command(label='Cut', command=self.cut)
edit_menu.add_command(label='Copy', command=self.copy)
edit_menu.add_command(label='Paste', command=self.paste)
menu.add_cascade(label='Edit', menu=edit_menu)
help_menu = tk.Menu(menu, tearoff=0)
help_menu.add_command(label='About', command=self.about)
menu.add_cascade(label='Help', menu=help_menu)
# create text boxes
self.text_box1 = scrolledtext.ScrolledText(self.root, wrap=constants.WORD, undo=True)
self.text_box1.pack(side='left', fill='both', expand=True)
self.text_box2 = scrolledtext.ScrolledText(self.root, wrap=constants.WORD, undo=True)
self.text_box2.pack(side='right', fill='both', expand=True)
# bind right click to show context menu
self.text_box1.bind('<Button-3>', self.show_context_menu)
self.text_box2.bind('<Button-3>', self.show_context_menu)
def show_context_menu(self, event):
# create context menu
menu = tk.Menu(self.root, tearoff=0)
menu.add_command(label='Cut', command=self.cut)
menu.add_command(label='Copy', command=self.copy)
menu.add_command(label='Paste', command=self.paste)
# show menu
try:
menu.tk_popup(event.x_root, event.y_root, 0)
finally:
menu.grab_release()
def new_file(self):
self.text_box1.delete('1.0', 'end')
self.text_box2.delete('1.0', 'end')
def open_file(self):
file_path = filedialog.askopenfilename()
if file_path:
with open(file_path, 'r') as file:
content = file.read()
self.text_box1.delete('1.0', 'end')
self.text_box1.insert('end', content)
def save_file(self):
file_path = filedialog.asksaveasfilename(defaultextension='.txt')
if file_path:
content = self.text_box1.get('1.0', 'end')
with open(file_path, 'w') as file:
file.write(content)
def save_as_file(self):
file_path = filedialog.asksaveasfilename(defaultextension='.txt')
if file_path:
content = self.text_box1.get('1.0', 'end')
with open(file_path, 'w') as file:
file.write(content)
def exit(self):
self.root.quit()
def cut(self):
# get selected text
text = self.root.focus_get().selection_get()
# copy to clipboard
clipboard.clear()
clipboard.append(text)
# delete selected text
self.root.focus_get().delete(constants.SEL_FIRST, constants.SEL_LAST)
def copy(self):
# get selected text
text = self.root.focus_get().selection_get()
# copy to clipboard
clipboard.clear()
clipboard.append(text)
def paste(self):
# get clipboard content
text = clipboard.get()
# insert clipboard content
self.root.focus_get().insert(constants.INSERT, text)
def about(self):
messagebox.showinfo('About', 'Text Editor v1.0')
if __name__ == '__main__':
root = tk.Tk()
editor = TextEditor(root)
root.mainloop()
在上述代码中,我们定义了一个名为TextEditor的类,它包含了两个文本框和一个菜单。我们使用tkinter.scrolledtext.ScrolledText类来创建文本框,并使用tkinter.Menu类来创建菜单。
在文本框上绑定右键单击事件,使用tkinter.Menu类创建上下文菜单,并使用tkinter.clipboard模块来实现复制、剪切和粘贴功能。
在菜单中添加菜单项,并为每个菜单项指定相应的函数。在每个函数中,我们可以使用tkinter.clipboard模块来访问剪贴板内容,并使用文本框的delete和insert方法来删除和插入文本。
原文地址: https://www.cveoy.top/t/topic/lMNW 著作权归作者所有。请勿转载和采集!