我目前正在学习Tkinter,但我无法在此处或Stackoverflow之外找到我的问题的解决方案。简而言之,我绑定到我的小部件的所有事件都是最初触发的,并且不会响应我的行为。
在此示例中,运行代码时,画布上会出现红色矩形,
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平台,但我还没有弄清楚它在问题中的作用。有谁能指出我在这里犯的错误?
答案 0 :(得分: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()
。因此,您需要使您的函数接受此参数,即使它不使用它。
总之,你的脚本应该是这样的(我改变的行在注释框中):
{{1}}
答案 1 :(得分: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)
。
将来,一旦熟悉了基础知识,您将使用事件对象并了解它为什么会被传递。