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