Tkinter 鼠标事件初始触发

0 投票
2 回答
523 浏览
提问于 2025-04-18 09:02

我现在正在学习Tkinter,但在这里和其他地方都找不到解决我问题的方法。简单来说,我绑定到我的控件上的所有事件一开始就被触发了,但之后却不再响应我的操作。

在这个例子中,当我运行代码时,红色的矩形会出现在画布上,

color=random.choice(['red', 'blue'])

但之后发现事件绑定就不再起作用了:

import Tkinter as tk

class application(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)
        self.can = tk.Canvas(master, width=200, height=200)
        self.can.bind('<Button-2>', self.draw())
        self.can.grid()
    def draw(self):
        self.can.create_rectangle(50, 50, 100, 100, fill='red')

app = application()
app.mainloop()

我使用的是Mac平台,但我对它在这个问题中的作用一点头绪都没有。有人能告诉我我在这里犯了什么错误吗?

2 个回答

0

你的代码里有两个错误。

1. self.can.bind('<Button-2>', self.draw())

这里你不应该直接调用一个方法。你应该指定一个方法,这个方法会在点击Button-2时被调用。

正确的写法是 self.can.bind('<Button-2>', self.draw)

2. def draw(self)

通常情况下,会有一个事件对象被传递给这个方法。你应该把这一行改成:

def draw(self, event)

将来,当你熟悉了基础知识后,你会使用这个事件对象,并且了解为什么会传递这个对象。

0

这里有两件事:

  1. 当你把 self.draw 绑定到 <Button-2> 时,不应该直接调用它。

  2. 当你点击 <Button-2> 时,会有一个事件对象被传递给 self.draw。所以,你的函数需要能够接受这个参数,即使你不打算使用它。

总的来说,你的脚本应该像这样(我修改的行在注释框里):

import Tkinter as tk

class application(tk.Frame):
    def __init__(self, master=None):
        tk.Frame.__init__(self, master)
        self.can = tk.Canvas(master, width=200, height=200)
        #######################################
        self.can.bind('<Button-2>', self.draw)
        #######################################
        self.can.grid()
    #######################
    def draw(self, event):
    #######################
        self.can.create_rectangle(50, 50, 100, 100, fill='red')

app = application()
app.mainloop()

撰写回答