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

How to use self and event in a class function?

无论我如何尝试,我总是收到需要向事件发送参数的错误。

是的,在你说去看文档之前。我看过它,但它对我正在做的事情没有帮助,因为它从来不在 class.

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

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

您已将回调定义为采用两个参数: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 参数。

迂腐地说,你不应该在 __init__ 内部调用 mainloop()。这会阻止 App 对象被完全构建。正确的做法是在构造函数之外调用 mainloop

A = App()
A.mainloop()