AttributeError: 'Event' object has no attribute 'Text1'

Question:

My purpose is to get the mouse selected text through the Tkinter Text control.

Part of the code:

self.Text1 = Text(top)
self.Text1.place(relx=0.07, rely=0.09, relheight=0.04, relwidth=0.34)
self.Text1.configure(background="white")
self.Text1.configure(font="TkTextFont")
self.Text1.configure(foreground="black")
self.Text1.configure(highlightbackground="#d9d9d9")
self.Text1.configure(highlightcolor="black")
self.Text1.configure(insertbackground="black")
self.Text1.configure(selectbackground="#c4c4c4")
self.Text1.configure(selectforeground="black")
self.Text1.configure(width=294)
self.Text1.configure(wrap=WORD)

self.Scrolledtext1 = ScrolledText(top)
self.Scrolledtext1.place(relx=0.46, rely=0.19, relheight=0.62
        , relwidth=0.4)
self.Scrolledtext1.configure(background="white")
self.Scrolledtext1.configure(font="TkTextFont")
self.Scrolledtext1.configure(foreground="black")
self.Scrolledtext1.configure(highlightbackground="#d9d9d9")
self.Scrolledtext1.configure(highlightcolor="black")
self.Scrolledtext1.configure(insertbackground="black")

def button_down(self,):
    global s
    s = self.Text1.index('@%s,%s wordstart' % (event.x, event.y))

def button_up(self, ):
    global e
    e = self.Text1.index('@%s,%s wordend' % (event.x, event.y))


def test(self,):
    print(self.Scrolledtext1.get(s,e))

self.Scrolledtext1.bind("<Button-1>", button_down)
self.Scrolledtext1.bind("<ButtonRelease-1>", button_up)
self.Button2.configure(command=test(self,))

Exception in Tkinter callbackļ¼š

screenshot of traceback showing exception being generated

AttributeError: 'Event' object has no attribute 'Text1'
Asked By: Kevin Daniel

||

Answers:

Your button_up, button_down and test functions are not bound methods. Therefore, they do not get the self parameter. The value being passed as self is actually an Event object. Since you use self in the functions, I would recommend changing them to being bound methods. I assume the code you posted is in the __init__ method. If so, change the last three lines to:

self.Scrolledtext1.bind("<Button-1>", self.button_down)
self.Scrolledtext1.bind("<ButtonRelease-1>", self.button_up)
self.Button2.configure(command=self.test)

And move the three functions to be members of the class:

def button_down(self, event):
    global s
    s = self.Text1.index('@%s,%s wordstart' % (event.x, event.y))

def button_up(self, event):
    global e
    e = self.Text1.index('@%s,%s wordend' % (event.x, event.y))


def test(self, event):
    print(self.Scrolledtext1.get(s,e))

Example

This is how your class should look afterwards. The three event handler functions are all inside the class.

class YourClassName:
    def __init__(self, *args, **kwargs):
        # initialization code
        # ...

        self.Scrolledtext1.bind("<Button-1>", self.button_down)
        self.Scrolledtext1.bind("<ButtonRelease-1>", self.button_up)
        self.Button2.configure(command=self.test)

    def button_down(self, event):
        global s
        s = self.Text1.index('@%s,%s wordstart' % (event.x, event.y))

    def button_up(self, event):
        global e
        e = self.Text1.index('@%s,%s wordend' % (event.x, event.y))


    def test(self, event):
        print(self.Scrolledtext1.get(s,e))
Answered By: FamousJameous

Try to pass evt instead of self in your function

Answered By: user21024313
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.