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

tkcalendar调用get_date()方法抛出AttributeError:'NoneType'对象无get_date属性问题求助

解决tkcalendar调用get_date()时的AttributeError问题

嘿,我一眼就发现问题所在啦!你遇到的AttributeError: 'NoneType' object has no attribute 'get_date',根源出在组件创建和布局的写法上。

错误原因

在Tkinter(包括tkcalendar)里,pack()、grid()、place()这些布局方法返回的都是None。你把Calendar组件的创建和pack()写在了同一行:

self.startCalendar = Calendar(...).pack(fill=X, pady=(0, 5))

这就导致self.startCalendar被赋值成了pack()的返回值——也就是None,而不是Calendar组件对象本身。当你在btn_click()里调用self.startCalendar.get_date()时,自然就会报错啦。

修复方案

把组件创建和布局操作分开写:先创建Calendar对象并赋值给self.startCalendar,再单独调用它的pack()方法。修改后的代码片段如下:

class Main(Frame):
    def __init__(self, parent):
        super(Main, self).__init__(parent)
        padding = 10
        # calenders
        mainCalendarFrame = Frame(root)
        # start
        startCalendarFrame = Frame(mainCalendarFrame)
        startLabel = Label(startCalendarFrame, text='Start')
        startLabel.pack(fill=X, pady=(0, padding))  # 分开布局
        # 先创建Calendar对象,再单独执行pack
        self.startCalendar = Calendar(startCalendarFrame, selectmode='day', 
                                      year=int(date.today().strftime('%Y')), 
                                      month=int(date.today().strftime('%m')), 
                                      day=int(date.today().strftime('%d')))
        self.startCalendar.pack(fill=X, pady=(0, 5))
        mainCalendarFrame.pack(padx=padding, pady=padding)
        settingsFrame.pack(fill=X, padx=padding, pady=padding)
        btnCalculate.pack(fill=X, padx=padding, pady=padding)
    
    def btn_click(self):
        print(self.startCalendar.get_date())

额外提示

不光是Calendar组件,Tkinter里所有的Widget(比如Label、Button这些)都要注意这个问题——永远不要把创建组件和布局方法写在同一行赋值,否则变量会变成None,后续调用组件方法就会触发类似的错误。

内容的提问来源于stack exchange,提问作者samuelhertrich

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 12:18:11