Python3 Tkinter 右クリックしたらメニューの出るエントリの作成


1. はじめに

今回はTkinterで,右クリックしたらメニューの出るエントリの作成を作成する.

2. ソースコード

myentry.py
import tkinter as tk


class MyEntry(tk.Entry):
    def __init__(self, master):
        self.default_fontfamily = "Yu Gothic UI"
        self.default_fontsize = 10

        super().__init__(master)
        self.__create_menu()
        self.__bind_event()


    def __create_menu(self):
        self.menu = tk.Menu(root, tearoff=0, background="#111111", foreground="#eeeeee", activebackground="#000000", activeforeground="#ffffff")
        self.menu.add_command(label = "Cut", command=self.__on_cut, font=(self.default_fontfamily, self.default_fontsize))
        self.menu.add_command(label = "Copy", command=self.__on_copy, font=(self.default_fontfamily, self.default_fontsize))
        self.menu.add_command(label = "Paste", command=self.__on_paste, font=(self.default_fontfamily, self.default_fontsize))
        self.menu.add_command(label = "Delete", command=self.__on_delete, font=(self.default_fontfamily, self.default_fontsize))
        self.menu.add_separator()
        self.menu.add_command(label = "Select all", command=self.__on_select_all, font=(self.default_fontfamily, self.default_fontsize))


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


    def __on_copy(self):
        self.event_generate("<<Copy>>")


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


    def __on_delete(self):
        # from tkinter/constants.py
        #first = self.index(tk.SEL_FIRST)
        #last = self.index(tk.SEL_LAST)

        first = self.index("sel.first")
        last = self.index("sel.last")
        self.delete(first, last)


    def __on_select_all(self):
        self.select_range(0, "end")


    def __bind_event(self):
        self.bind("<Button-3>", self.__do_popup)


    def __do_popup(self, e):
        try:
            self.menu.tk_popup(e.x_root, e.y_root)
        finally:
            self.menu.grab_release()


if __name__ == "__main__":
    root = tk.Tk()

    entry1 = MyEntry(root)
    entry1.grid()

    entry2 = MyEntry(root)
    entry2.grid()

    root.mainloop()

外観等

補足説明

MyEntry()のコンストラクタ(__init__())内で,継承したtk.Entry の コンストラクタ(__init__())を読んだ後,tk.Menu の設定をしている.

使用時は if __name__ == "__main__": にあるように,tk.Entry と同様の使い方をする.

3.おわりに

深くは記載しない.