如何在事件处理器中访问外部对象?

4 投票
1 回答
1751 浏览
提问于 2025-04-15 21:44

正如标题所说,我在Tkinter中处理一个运动触发的事件时,想要获取光标的位置。

我想用这个位置来更新一个已经存在的标签(Label)控件。但是我怎么也搞不明白,如何在事件处理器里面修改这个标签的文本(或者说其他外部对象)。我了解到,事件处理器里只传入了一个事件参数,这意味着我不能把标签对象传进去。

我该如何在事件处理器外部访问这些对象呢?

1 个回答

3

Tkinter不会在事件处理程序中自动传递对象,反正它也不知道你对哪个对象感兴趣。

所以,你需要自己去获取你想要更新的对象,比如你的事件处理程序可以是一个简单的函数,它可以访问全局对象,或者它可以是一个对象的方法,通过self来访问那个对象。

下面是一个使用全局对象的方法

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()

撰写回答