Функция Python, выдающая ошибку типа, говорит, что я ввел аргумент, когда я этого явно не сделал

#python #tkinter #typeerror

#python #tkinter #ошибка типа

Вопрос:

У меня небольшая проблема. Я пытаюсь привязать функцию к щелчку мыши в модуле tkinter Python. Функция добавляет 1 к переменной каждый раз, когда вы нажимаете. Эта функция не принимает аргументов. Однако, когда я привязываю функцию к щелчку мыши, она говорит:

 TypeError: func() takes 0 positional arguments but 1 was given.
  

Я никогда не давал функции никаких аргументов и просто привязывал ее к щелчку мыши, и Python все еще думает, что я сделал что-то не так. Помочь? Код прилагается.

 from tkinter import *
root = Tk()
root.geometry('800x600')
root.title("Sim Game")
c = Canvas(root, height=400, width=600, bg='red')
x = 0
def func():
    global x
    x  = 1
c.bind("<Button-1>", func)

c.pack()

root.mainloop()
  

Комментарии:

1. можете ли вы добавить еще трассировку ошибок?

2. Я считаю, что когда Tk вызывает функцию, она передает event аргумент (в данном случае нажатие кнопки). Если вас не волнует нажатие кнопки, добавьте параметр в объявление функции и забудьте об этом.

3. Небольшое исследование показало бы, что функции получают объект события при вызове из события.

Ответ №1:

У вас есть несколько вариантов:

 def func(event=None)
  

или

 c.bind('<Button-1>', lambda e: func())
  

Комментарии:

1. Вы, ребята, настоящие гении. Спасибо!

2. Должно быть lambda e: func() вместо этого.

3.@Matiiss нет, я думаю, они имеют lambda: func в виду, что это неверно. Для начала, вы определенно хотите, чтобы лямбда-выражение вызывалось func() , но, кроме того, это лямбда-выражение не принимает аргументов, поэтому оно выдаст ту же точную ошибку

4. @juanpa.arrivillaga насколько я знаю, нет большой разницы между lambda: func и lambda e: func()

5. @Matiiss это две совершенно разные вещи. Попробуйте сами. def foo(): return 42 попытка (lambda: foo)() и (lambda: foo())()