【问题标题】:Tkinter mouse event initially triggeredTkinter 鼠标事件最初触发
【发布时间】:2014-06-08 15:20:49
【问题描述】:

我目前正在学习 Tkinter,在 Stackoverflow 和 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 平台,但我不知道它在问题中的作用。谁能指出我在这里犯的错误?

【问题讨论】:

    标签: python macos events tkinter


    【解决方案1】:

    这里有两件事:

    1. 当你将self.draw绑定到&lt;Button-2&gt;时,你不应该调用它。

    2. 当您单击&lt;Button-2&gt; 时,将向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()
    

    【讨论】:

    • 谢谢,这对我来说很好。但是我还有另一个问题 - 我如何做按钮?当我制作一个按钮时,我使用 command=funcname,如果我不在这里添加“事件”参数,我会得到一个错误。从函数 args 列表中删除事件是可行的,但我想这不是正确的做法?
    • @AlexAgapov - 不,这是正确的。 Tkinter.Button 确实 向函数发送事件对象。只有绑定才能做到这一点,就像你的例子一样。因此,如果您有一个将与 Tkinter.Button 一起使用的函数,只需省略事件参数即可。您只需要带有绑定的事件参数。
    • @AlexAgapov - 此外,如果您有一个将与绑定和Tkinter.Button 一起使用的函数,您应该省略事件参数,而是使用带有绑定的 lambda 函数。例如:self.can.bind('&lt;Button-2&gt;', lambda event: self.draw())
    • 因此,如果我需要将我的函数同时绑定到鼠标和按钮(尽管我几乎看不到任何机会),我将不得不创建两个不同的函数?编辑:没有看到你的最后一个答案。非常感谢!
    • 即使这个问题不是最新的——如果你想将它与 Button 和绑定一起使用,你可以使用 def function_name(self, event=None): 将事件参数设置为可选,这样你的事件对象是默认的用None 初始化。因此,您还可以(如有必要)检查您的函数是否由 Button-command 或 Binding 调用。
    【解决方案2】:

    您的代码中有两个错误。

    1.self.can.bind('&lt;Button-2&gt;', self.draw())

    您不应该进行方法调用。您应该分配一个应该在单击 Button-2 时调用的方法

    self.can.bind('&lt;Button-2&gt;', self.draw)

    2.def draw(self)

    大多数时候,会传递一个事件对象。您应该将该行更改为

    def draw(self, event).

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

    【讨论】:

      猜你喜欢
      • 2018-12-24
      • 2013-12-15
      • 1970-01-01
      • 1970-01-01
      • 2012-11-26
      • 2013-09-30
      • 2016-08-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多