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'
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))
Try to pass evt instead of self in your function
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'
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))
Try to pass evt instead of self in your function