Tkinter 鼠标事件初始触发
我现在正在学习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
这里有两件事:
当你把
self.draw
绑定到<Button-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()