You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 04:15:02