Tkcalendar get_date传参后第二次调用报TypeError问题咨询
问题原因
你定义的类变量和类方法使用了完全相同的名称selected_date:
- 第一次点击按钮时,程序调用的是类方法
selected_date(),方法执行时代码cls.selected_date = cal_date会直接把原类方法覆盖为字符串类型的类变量 - 第二次点击按钮时,再执行
test_class.selected_date()语句,此时selected_date已经是字符串,无法作为函数被调用,就会抛出TypeError: 'str' object is not callable报错
解决方法
只需要修改类变量或者类方法的名称,避免二者重名即可,例如把存储日期的类变量改名为selected_date_val,修改后的完整代码如下:
from tkinter import * from tkcalendar import * import datetime class test_class(): # 修改类变量名,避免和类方法重名 selected_date_val = "" def __init__(self): self.window = Tk() self.stu_cal = Calendar(self.window,selectmode="day",year=int(test_class.get_year()),month=int(test_class.get_month())) self.stu_cal.grid(row=9,column=0) self.b3 = Button(self.window,text="Select this date",bg='#B6BDC4',fg='white',command=self.add_selected_date) self.b3.grid(row=9,column=6) self.window.mainloop() def add_selected_date(self): test_class.selected_date(self.stu_cal.get_date()) @staticmethod def get_year(): currentDateTime = datetime.datetime.now() date = currentDateTime.date() return date.strftime("%Y") @staticmethod def get_month(): currentDateTime = datetime.datetime.now() date = currentDateTime.date() return date.strftime("%m") @classmethod def selected_date(cls,cal_date): # 给重命名后的类变量赋值 cls.selected_date_val = cal_date test_class()
如果不需要额外的赋值逻辑,也可以直接在按钮触发的方法中给类变量赋值,省去单独写类方法的步骤,代码更简洁:
def add_selected_date(self): test_class.selected_date_val = self.stu_cal.get_date()
内容的提问来源于stack exchange,提问作者Endo
相关产品推荐
相关产品推荐

