通过 python 中的构造函数将函数作为 class 函数传递

Pass a function as a class function through constructor in python

我正在尝试在 python 中创建一个 class,它允许您通过构造函数传递已执行的 onclick 代码。到目前为止:

import tkinter as tk
import PIL
from PIL import ImageTk, Image

class closeIcon:
  path = ""
  width = 0
  height = 0
  xpos = 0
  ypos = 0
  onclick = 0
  canv = ""

  def __init__(self, path, width, height, xpos, ypos, onclick, canv):
    self.path = path
    self.width = width
    self.height =  height
    self.xpos = xpos
    self.ypos = ypos
    self.onclick = onclick
    self.canv = canv
    self.img = Image.open(self.path).resize((self.width, self.height), Image.ANTIALIAS)
    self.img_ = ImageTk.PhotoImage(self.img)
    self.label = tk.Label(self.canv, image=self.img_, bg=self.canv["background"])
    self.label.place(x=xpos, y=ypos)
    self.label.bind("<Button-1>", self.onclick)

我如何从 class 中实例化对象的示例:

closeAppIcon = closeIcon("assets/cross1.png", 30, 30, winWidth-45, 10, {print("Hello")}, canvas_)

但是每当我 运行 应用程序时,我什至没有单击图像就在控制台中收到了 Hello,当我单击图像时,我收到以下错误消息:

Exception in Tkinter callback Traceback (most recent call last): File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0\lib\tkinter_init_.py", line 1883, in call return self.func(*args) TypeError: 'set' object is not callable

我做错了什么?

{print("Hello")} 是一个包含元素 None 的集合。您的代码需要在那个地方有一个函数。如果你想传递一个包含语句 print("Hello") 的函数,你可以使用:

lambda *args: print("Hello")

这定义了一个函数,它将接受任意数量的位置参数并打印“Hello”。