如何在类函数中使用self和event?

时间:2015-11-11 22:02:37

标签: python-3.x tkinter tkinter-canvas

无论我如何尝试,我都会收到我需要向活动发送参数的错误。

并且在您说要查看文档之前是。我已经看了它,但它对我正在做的事情没有帮助,因为它永远不会在课堂上。

from tkinter import *

class App(Tk):
    def __init__(self):
        Tk.__init__(self)
        self.callback()
        self.initUI()

        self.mainloop()

    def callback(self, event):
        print("made it")

    def initUI(self):

        canvas = Canvas(self, height = 300, width = 300)
        canvas.create_rectangle(1.5,1.5,40,40, tag = "obj1")
        canvas.tag_bind("obj1", '<Button-1>', callback) #where I assume the problem is happening

A = App()

编辑:回调一直说它需要另一个论点,但我不知道它需要什么

1 个答案:

答案 0 :(得分:0)

您已将回调定义为采用两个参数:self(意思是,它是对象上的方法)和event。当您使用self.callback()直接调用它时,self会自动通过,但您不会在事件中传递。这就是为什么你得到错误说它需要另一个参数。它预计有两个,但只有一个。

通过直接调用您的回调,您不清楚自己尝试做什么,但快速解决方法是将event属性设置为可选,以便您可以直接或通过绑定调用回调。当然,这仅在您的绑定实际上不使用event参数时才有效。如果是这样,在没有event的情况下调用它时,您可能会发现它失败。

以下是使event参数可选的示例:

def callback(self, event=None):
    print("made it")

解决了一个问题,但您还必须更改绑定的定义方式,否则代码会在启动时崩溃。您需要在回调中添加self

canvas.tag_bind("obj1", '<Button-1>', self.callback) 

调用回调时,self会再次作为第一个参数自动传递。 Tkinter会自动添加event参数。

迂腐地说,你不应该在mainloop()内拨打__init__。这可以防止App对象完全构建。正确的方法是在构造函数之外调用mainloop

A = App()
A.mainloop()