Search code examples
pythontkinterpmw

I have too fix something in my Copy&Paste program in Python


This is my Copy&Paste program:

from tkinter import *
import Pmw
class CopyTextWindow(Frame):

    def __init__(self):
        Frame.__init__(self)
        Pmw.initialise()
        self.pack(expand=YES, fill=BOTH)
        self.master.title("ScrolledText Demo")
        self.frame1=Frame(self, bg="White")
        self.frame1.pack(expand=YES, fill=BOTH)

        self.text1=Pmw.ScrolledText(self, text_width=25, text_height=12, text_wrap=WORD,
                              hscrollmode="static", vscrollmode="static")
        self.text1.pack(side=LEFT, expand=YES, fill=BOTH, padx=5, pady=5)

        options = ["Copy", "Paste"]
        self.selectedOption = StringVar()

        self.menu = Menu(self.frame1, tearoff=0)

        for option in options:
            self.menu.add_radiobutton( label=option, variable=self.selectedOption,
                                   command=self.ExecuteOption)

        self.text1.bind("<Button-3>", self.popUpMenu)

    def popUpMenu(self, event):
        self.menu.post(event.x_root, event.y_root)

    def ExecuteOption(self):
        if self.selectedOption.get()=="Copy":
            self.CopiedText=self.text1.get(SEL_FIRST, SEL_LAST)
        else:
            self.text1.settext( self.text1.get()+self.CopiedText)

def main():
    CopyTextWindow().mainloop()

if __name__=="__main__":
    main()

In this program, I want to make a GUI, that in it you can copy and paste text that you have selected. when you press the right mouse button, a little menu with the Copy and Paste options.

The program opens up, but when I press the right mouse button, no menu appears. Python also doesn't complain with an error.

I need to understand my mistake in this code.


Solution

  • For a reason I ignore, the event doesn't seem to be triggered when the bind is on the Text or on the Frame, but it works when it's on the main window:

    from tkinter import *
    import Pmw
    class CopyTextWindow(Frame):
    
        def __init__(self, master=None):
            # I've added a master option to pass to the frame
            Frame.__init__(self, master)
            Pmw.initialise()
            self.pack(expand=YES, fill=BOTH)
            self.master.title("ScrolledText Demo")
            self.frame1=Frame(self, bg="White")
            self.frame1.pack(expand=YES, fill=BOTH)
    
            self.text1=Pmw.ScrolledText(self, text_width=25, text_height=12, text_wrap=WORD,
                                  hscrollmode="static", vscrollmode="static")
            self.text1.pack(side=LEFT, expand=YES, fill=BOTH, padx=5, pady=5)
    
            options = ["Copy", "Paste"]
            self.selectedOption = StringVar()
    
            self.menu = Menu(self.frame1, tearoff=0)
    
            for option in options:
                self.menu.add_radiobutton( label=option, variable=self.selectedOption,
                                       command=self.ExecuteOption)
    
        def popUpMenu(self, event):
            print("ok")
            self.menu.post(event.x_root, event.y_root)
    
        def ExecuteOption(self):
            if self.selectedOption.get()=="Copy":
                self.CopiedText=self.text1.get(SEL_FIRST, SEL_LAST)
            else:
                self.text1.settext( self.text1.get()+self.CopiedText)
    
    def main():
        # main window
        root = Tk()
        ctw = CopyTextWindow(root)
        # bind on the main window
        root.bind("<Button-3>", ctw.popUpMenu)
        root.mainloop()
    
    if __name__=="__main__":
        main()