Python:类型错误:尝试根据日历条目进行更新时,“NoneType”对象不可调用

问题描述 投票:0回答:1

我看过很多例子,但不知道如何解决我的问题。我是一条蟒蛇n00b。

我有一个来自 tkinter 的日历日期选择器。选择日期时,它会调用一个函数来根据日期输入计算年龄。计算后,我希望它更新变量“年龄”,以便每次从日历中选择新日期时它都可以显示正确的年龄。该方法在加载框架时有效,因为它将初始设置日期作为出生日期,但不会显示正确的年龄。第一次选择任何其他日期(第二次输入)时也不起作用,它会给出以下错误:

line 1892, in __call__
return self.func(*args)
TypeError: 'NoneType' object is not callable

全局变量

ageSelection = tkinter.StringVar()
age = 0

日历选择器

calPicker = DateEntry(studentInfoRightFrame, selectmode="day", year=2024, month=2, day=7, date_pattern="yyyy-mm-dd", textvariable=ageSelection)
calPicker.grid(row=1, column=0, padx=20, pady=0)
ageSelection.trace('w', getAge(date.today(), calPicker.get_date()))'

年龄标签显示年龄:

ageLabel = ctk.CTkLabel(master=studentInfoRightFrame, text=age, font=('Calibri', 20))
ageLabel.grid(row=0, column=1, pady=0)

计算年龄的方法(该方法第一次工作,当使用2024-02-07作为出生日期的lading日历选择器时)

def getAge(today, dob):
print(today)
print(dob)
dob_result = str(dob)
dob_data = dob_result.split("-")
year = int(dob_data[0])
month = int(dob_data[1])
day = int(dob_data[2])

print(year)
print(month)
print(day)

age = (today - date(year, month, day)).days
age = age / 365
print(age)
age = round(age)
ageSelection = round(age)
print(round(age))

完整跟踪调用:

2024-02-09
2014-02-07
2014
2
7
10.01095890410959
10
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\Manny\AppData\Local\Programs\Python\Python38\lib\tkinter\__init__.py", line 1892, in __call__
return self.func(*args)
TypeError: 'NoneType' object is not callable
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\Manny\AppData\Local\Programs\Python\Python38\lib\tkinter\__init__.py", line 1892, in __call__
return self.func(*args)
TypeError: 'NoneType' object is not callable
python tkinter calendar
1个回答
0
投票

我相信这行代码就是问题所在:

ageSelection.trace('w', getAge(date.today(), calPicker.get_date()))

trace()
的第二个参数应该是一个可调用函数。

您的编码方式是,您正在调用

getAge()
,并且该调用的 结果 作为第二个参数传递给
trace()

但是

getAge()
不返回任何内容,因此默认返回
None
。因此
trace()
尝试调用
None
,这会导致错误。

我认为也许你应该将

getAge
函数 itself 作为第二个参数传递给
trace()
,而不是立即调用
getAge()
然后使用其返回值。

© www.soinside.com 2019 - 2024. All rights reserved.