Как получить доступ к внешнему объекту в обработчике событий? - PullRequest
4 голосов
/ 18 апреля 2010

Как видно из заголовка, я получаю местоположение курсора в обработчике событий, запускаемых движением, в Tkinter.

Я хочу обновить существующий виджет метки с указанием местоположения. Однако я не могу понять, как редактировать текстовое поле Label (или любой другой объект в этом отношении) в обработчике событий. Из того, что я понимаю, событие является единственным аргументом, передаваемым обработчику, что означает, что я не могу передать объект метки.

Как получить доступ к объектам вне обработчика?

1 Ответ

3 голосов
/ 18 апреля 2010

Tkinter не будет передавать объекты в обработчике событий, и вообще, как он узнает, какой объект вас интересует?

Вместо этого вы несете ответственность за доступ к объектам, которые вы хотите обновить, из обработчика событий, например, ваш обработчик событий может быть простой функцией и может обращаться к глобальному объекту, или он может быть методом объекта и может обращаться к этому объекту через себя.

Вот способ использования глобальных объектов

from Tkinter import *

root = Tk()
frame = Frame(root)
frame.configure(width=300,height=300)

def onmotion(event):
    root.title("Mouse at %s,%s"%(event.x, event.y))

frame.bind("<Motion>", onmotion)
frame.pack()
root.title("Event test")
root.mainloop()

То же самое можно сделать объектно-ориентированным способом

from Tkinter import *

class MyFrame(Frame):
    def __init__(self, root):
        Frame.__init__(self, root)
        self.parent = root
        self.configure(width=300,height=300)
        self.pack()
        self.bind("<Motion>", self.onmotion)

    def onmotion(self, event):
        self.parent.title("Mouse at %s,%s"%(event.x, event.y))

root = Tk()
frame = MyFrame(root)
root.title("Event test")
root.mainloop()
...