Tkinter鼠标事件最初触发

时间:2014-06-08 15:20:50

标签: python macos events tkinter

我目前正在学习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平台,但我还没有弄清楚它在问题中的作用。有谁能指出我在这里犯的错误?

2 个答案:

答案 0 :(得分:0)

这里有两件事:

  1. self.draw绑定到<Button-2>后,您不应该致电<Button-2>

  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() 。因此,您需要使您的函数接受此参数,即使它不使用它。

  3. 总之,你的脚本应该是这样的(我改变的行在注释框中):

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

将来,一旦熟悉了基础知识,您将使用事件对象并了解它为什么会被传递。