如何在 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()
无论我如何尝试,我总是收到需要向事件发送参数的错误。
是的,在你说去看文档之前。我看过它,但它对我正在做的事情没有帮助,因为它从来不在 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()