简体   繁体   中英

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM