Caja de texto con menú de copiar, cortar y pegar en Tcl/Tk (tkinter)



Las cajas de texto (clases ttk.Entry y tk.Entry) proveen por defecto la funcionalidad de copiar, cortar y pegar contenido vía los atajos del teclado, no así el clásico menú contextual como se muestra en la siguiente imagen.

Menú contextual en caja de texto

No obstante, implementarlo manualmente es una tarea más o menos sencilla. Creamos una nueva clase a la que llamaremos EntryEx, que heredará toda la funcionalidad de ttk.Entry, pero además añadirá las opciones de copiar, cortar y pegar usando un menú contextual.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import tkinter as tk
from tkinter import ttk


class EntryEx(ttk.Entry):
    
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.menu = tk.Menu(self, tearoff=False)
        self.menu.add_command(label="Copiar", command=self.popup_copy)
        self.menu.add_command(label="Cortar", command=self.popup_cut)
        self.menu.add_separator()
        self.menu.add_command(label="Pegar", command=self.popup_paste)
        self.bind("<Button-3>", self.display_popup)
    
    def display_popup(self, event):
        self.menu.post(event.x_root, event.y_root)
    
    def popup_copy(self):
        self.event_generate("<<Copy>>")

    def popup_cut(self):
        self.event_generate("<<Cut>>")

    def popup_paste(self):
        self.event_generate("<<Paste>>")


root = tk.Tk()
entry = EntryEx(root)
entry.pack()
root.mainloop()

De este modo, cada vez que precisemos una caja de texto con tal funcionalidad, crearemos una instancia de EntryEx.



Deja un comentario